출처 : 안드로이드 프로그래밍 정복 1
* p47 ~ 4가지 구성 요소
- 실행파일과 프로세스가 1:1로 대응되며 응용프로그램 끼리는 서로 완전히 독립적이다.
- main 같은 유일한 진입점이 따로 없으며 처음으로 생성되는 인스턴스의 생성자가 실질적인 진입점이 된다.
- 4개의 컴포넌트
1) 액티비티
2) 서비스
3) 방송 수신자
4) 컨텐트 제공자
- 응용 프로그램은 이들 컴포넌트 중 일부만을 가질 수도 있고 여러 개를 가질 수도 있다.
응용 프로그램의 컴포넌트 구성은 매니페스트라는 설정파일에 저장 및 관리 되며
최초 실행시 어떤 액티비티를 띄울 것인가도 매니페스트에서 지정한다.
- 4가지 컴포넌트들을 서로 독립적으로 동작하므로 상호간의 통신을 위한 장치가 필요한데 이 역할을 인텐트가 담당한다.
인텐트는 컴포넌트 간의 통신 수단이며 메시지에 대하 상세한 정보를 가진다.
AndroidManifest.xml 기본 예제
( 메인 액티비티에 MAIN, LAUNCHER 속성을 가져야 쉘에 액티비티가 나타난다.
차후 프로젝트에 액티비티나 인텐트 필터, 서비스 등을 추가한다거나 프로그램 실행에 필요한 권한을 지정할 때 이 파일을 편집 )
더보기
메인 클래스 파일 작성
더보기 접기
import android.R;
import android.app.Activity;
import android.os.Bundle;
public class main extends Activity {
@Override
public void onCreate ( Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
접기 - 메인클래스는 Activity클래스를 상속받는다.
- Activity는 화면 하나를 표현하므로 이 클래스를 상속받으면 화면 하나가 만들어 진다.
- 액티비티가 생성될 때 호출되는 onCreate 메서드를 제정의하여 필요한 초기화를 하는데 제일 먼저 슈퍼 클래스인 ctivity의 onCreate를 호출하여 부모부터 초기화한다.
- 운영체제가 요구하는 초기화를 수행한 후에 setContentView메서드를 호출해 액티비티에 내용물을 채운다.
xml로 화면을 만들어 보자.
fill_parent, match_parent 차이를 검색해 봄
* match_parent는 API 8이상부터 사용가능 하며, 하위 버전에서는 fill_parent를 사용하여야 하므로
match_parent를 사용하기 위해서 Min_API는 8 이상이 되어야 한다 .
(http://younghooni.tistory.com/entry/Android-fillparent-matchparent-%EC%B0%A8%EC%9D%B4 )
음.. 그래도 일단 찾아봄.( http://dkdlel072.tistory.com/entry/fillparent-%EC%99%80-wrapcontent%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90 )
fill_parent : 부모가 가지는 길이를 모두 채울 때 사용. (해당 레이아웃을 취하는 컨테이너의 길이를 모두 사용)
wrap_content : 해당 뷰가 그려질 수 있게 필요한 길이만 사용. 절대값을 넣을 수 있다.
더보기 접기
접기
@+id 와 @id 의 차이
'@'기호는 id를 리소스(R.java)에 정의하거나 참조한다는 뜻이고 무조건 붙여야 한다.
'+'기호는 ID를 새로 정의한다는 뜻인데 처음 정의할 때만 붙이고 참고할 때는 붙이지 않는다.
소문자 id는 예약어이므로 그대로 쓰면 되고 '/' 뒤에 원하는 이름을 작성한다.
=> 가장 처음에 id가 없는 아이를 만들때는 @+id 를 쓰고
이미 존재하는 id를 가져다 쓸때는 @id를 쓰면 된다는 말
onItemClick / setOnClickListener 차이
는 없다. 방법이 다를 뿐 결과는 같다.
http://croute.me/446
더보기 접기
[Android] (안드로이드) 리스트뷰 아이템 클릭 이벤트 - ListView Item Click 안드로이드에서 리스트뷰의 한 아이템(리스트의 한 항목)을 클릭했을 때, 클릭 이벤트를 처리하는 방법에는 크게 두가지가 있습니다. 1. 어댑터에서 onClick 메소드를 통해 처리
2. 액티비티에서 onItemClick 메소드를 통해 처리
이 포스트에서는 " 리스트뷰에 사용하는 데이터와 어댑터는 만들어져 있다고 가정 "하고, 리스트뷰의 아이템 클릭에 대한 처리에 주력하도록 합니다. 예제 프로젝트의 목표 예제는 색상에 대한 데이터를 리스트로 화면에 보여주고, 항목을 클릭하면 다음 액티비티로 데이터를 넘겨주어, 해당 데이터를 이용해서 알럿다이얼로그를 생성하는 것까지 입니다.
package : me.croute.listview.itemclick.common - Data.java : ArrayList 에 generic으로 사용할 도메인 클래스입니다. - ItemClickExampleNextActivity.java : 클릭된 항목의 데이터를 받을 타겟(이동할 목표가 되는) 액티비티입니다. Data.java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package
me.croute.listview.itemclick.common;
/**
* 아이템 클릭 예제에 사용하는 데이터 도메인 클래스
* 타이틀, 설명, 색상(int)의 세가지 데이터로 구성되어 있다.
*
* @author croute
* @since 2011.07.12
*/
public
class
Data
{
private
String title;
private
String description;
private
int
color;
/**
* 데이터 클래스 기본 생성자
*/
public
Data()
{
super
();
}
/**
* 데이터 클래스 생성자
*
* @param title 타이틀
* @param description 설명
* @param color 색상
*/
public
Data(String title, String description,
int
color)
{
super
();
this
.title = title;
this
.description = description;
this
.color = color;
}
/**
* 색상 이름을 반환합니다.
*
* @return
*/
public
String getTitle()
{
return
title;
}
/**
* 색상 이름을 저장합니다.
*
* @param title
*/
public
void
setTitle(String title)
{
this
.title = title;
}
/**
* 색상에 대한 설명을 반환합니다.
*
* @return
*/
public
String getDescription()
{
return
description;
}
/**
* 색상에 대한 설명을 저장합니다.
*
* @param description
*/
public
void
setDescription(String description)
{
this
.description = description;
}
/**
* 색상값을 반환합니다.
*
* @return
*/
public
int
getColor()
{
return
color;
}
/**
* 색상값을 저장합니다.
*
* @param color Color.SOMETHING
*/
public
void
setColor(
int
color)
{
this
.color = color;
}
}
ItemClickExampleNextActivity.java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package
me.croute.listview.itemclick.common;
import
me.croute.R;
import
android.app.Activity;
import
android.app.AlertDialog;
import
android.content.DialogInterface;
import
android.graphics.Color;
import
android.os.Bundle;
import
android.widget.LinearLayout;
/**
* ItemClickExampleNextActivity
* : 이전 액티비티에서 클릭된 아이템을 Bundle에 받아왔다.
*
* @author croute
* @since 2011.07.12
*/
public
class
ItemClickExampleNextActivity
extends
Activity
{
@Override
protected
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.item_click_example_next_activity);
String title = getIntent().getStringExtra(
"title"
);
String description = getIntent().getStringExtra(
"description"
);
int
color = getIntent().getIntExtra(
"color"
, Color.WHITE);
LinearLayout llBackground = (LinearLayout)findViewById(R.id.item_click_example_next_activity_ll_background);
llBackground.setBackgroundColor(color);
alert(title, description);
}
/**
* 자체적으로 만든 알럿다이얼로그 생성 메소드
*
* @param title 타이틀
* @param message 메시지
*/
private
void
alert(String title, String message)
{
new
AlertDialog.Builder(
this
)
.setTitle(title)
.setMessage(message)
.setCancelable(
false
)
.setPositiveButton(
"확인"
,
new
DialogInterface.OnClickListener()
{
public
void
onClick(DialogInterface dialog,
int
which)
{
dialog.dismiss();
finish();
}
})
.show();
}
}
리스트뷰의 아이템 클릭 이벤트 : 액티비티에서의 처리
package : me.croute.listview.itemclick.implements_activity - ActivityItemClickExampleActivity.java : 리스트뷰의 클릭이벤트를 처리하는 액티비티입니다.
리스트뷰의 클릭이벤트를 액티비티에서 구현하는데에 있어서 필요한 코드는 많지 않습니다.
public
class
ActivityItemClickExampleActivity
extends
Activity
implements
OnItemClickListener
클래스의 선언부에는 implements
OnItemClickListener
를 사용해 해당 액티비티가 OnItemClickListener를 구현하도록 해줍니다.mLvData.setOnItemClickListener(
this
);
리스트뷰에 아이템클릭리스너를 등록해서 아이템 클릭에 대한 이벤트를 청취(Listen)할 수 있도록 해줍니다. 여기서 this (해당 클래스를 뜻함)를 사용한 것은 액티비티가 해당 인터페이스(OnItemClickListener)를 구현(implements)하였기 때문입니다. public
void
onItemClick(AdapterView<?> parent, View v,
int
position,
long
id)
onItemClick 메소드를 override합니다. 실제로 이곳에서 클릭 이벤트에 대한 모든 처리를 하게됩니다.
액티비티 자체에서 이 메소드를 오버라이드 할 수 있는 것은 OnItemClickListener를 구현한다고 선언하였기 때문입니다.
ActivityItemClickExampleActivity.java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package
me.croute.listview.itemclick.implements_activity;
import
java.util.ArrayList;
import
me.croute.R;
import
me.croute.listview.itemclick.common.Data;
import
me.croute.listview.itemclick.common.ItemClickExampleNextActivity;
import
android.app.Activity;
import
android.content.Intent;
import
android.graphics.Color;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemClickListener;
import
android.widget.ListView;
/**
* 리스트뷰 아이템 클릭 예제 액티비티
* : 아이템을 클릭하면 ItemClickExampleNextActivity로 이동한다.
*
* @author croute
* @since 2011.07.12
*/
public
class
ActivityItemClickExampleActivity
extends
Activity
implements
OnItemClickListener
{
private
ListView mLvData;
@Override
protected
void
onCreate(Bundle savedInstanceState)
{
mLvData.setOnItemClickListener(
this
);
}
public
void
onItemClick(AdapterView<?> parent, View v,
int
position,
long
id)
{
Data data = mList.get(position);
Bundle extras =
new
Bundle();
extras.putString(
"title"
, data.getTitle());
extras.putString(
"description"
, data.getDescription());
extras.putInt(
"color"
, data.getColor());
Intent intent =
new
Intent(
this
, ItemClickExampleNextActivity.
class
);
intent.putExtras(extras);
startActivity(intent);
}
}
리스트뷰의 아이템 클릭 이벤트 : 어댑터에서의 처리
package : me.croute.listview.itemclick.implements_adapter - AdapterListViewCustomAdapter.java : 리스트뷰의 클릭이벤트를 처리하는 어댑터입니다.
implements
OnClickListener
어댑터에서는 OnClickListener를 implements합니다.
하나의 View에 대한 클릭 이벤트를 같은 방식으로 리스트뷰의 모든 아이템에 적용한다고 생각하면 됩니다.
convertView.setOnClickListener(
this
);
뷰(아이템의 한 항목에 해당, row)에 OnClickListener를 등록해 줍니다.
해당 아이템이 클릭되었을 때, 클릭되었다는 이벤트를 청취(Listen)할 수 있도록 해줍니다.
public
void
onClick(View v)
onClick을 override합니다. 이곳에서 해당 아이템에 대한 클릭이벤트를 처리합니다.
AdapterListViewCustomAdapter.java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package
me.croute.listview.itemclick.implements_adapter;
import
java.util.ArrayList;
import
me.croute.R;
import
me.croute.listview.itemclick.common.Data;
import
me.croute.listview.itemclick.common.ItemClickExampleNextActivity;
import
android.content.Context;
import
android.content.Intent;
import
android.os.Bundle;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.view.ViewGroup;
import
android.widget.ArrayAdapter;
import
android.widget.ImageView;
import
android.widget.TextView;
/**
* 아이템 클릭 예제에 사용할 리스트뷰 커스텀 어댑터
* ArrayAdapter를 확장했다.
* Generic 으로 Data 클래스를 사용했다.
*/
public
class
AdapterListViewCustomAdapter
extends
ArrayAdapter<Data>
implements
OnClickListener
{
/**
* position(index)를 통해 리스트에서 해당 position의 item을 반환한다.
*/
@Override
public
Data getItem(
int
position)
{
return
mList.get(position);
}
/**
* 해당 position의 뷰를 만들어 반환한다.
*/
@Override
public
View getView(
int
position, View convertView, ViewGroup parent)
{
convertView.setTag(position);
convertView.setOnClickListener(
this
);
return
convertView;
}
public
void
onClick(View v)
{
int
position = (Integer) v.getTag();
Data data = getItem(position);
Bundle extras =
new
Bundle();
extras.putString(
"title"
, data.getTitle());
extras.putString(
"description"
, data.getDescription());
extras.putInt(
"color"
, data.getColor());
Intent intent =
new
Intent(mContext, ItemClickExampleNextActivity.
class
);
intent.putExtras(extras);
mContext.startActivity(intent);
}
}
다음 액티비티로 데이터 넘기기, 다음 액티비티에서 데이터 받기
안드로이드에서 액티비티와 액티비티간에 데이터를 전달, 교환하는 경우, Intent 및 Bundle을 사용합니다.
Intent 에서 putExtra 메소드(여러가지 데이터타입을 처리할 수 있도록 overload되어있다.)를 사용하는 방법과,
Bundle 에서 putString, putInt 등 명시적으로 사용하는 방법이 있습니다.
여기서는 Bundle을 사용해 데이터 처리에 대한 부분을 명시적으로 하고, 해당 Bundle을 Intent에 넣는(put) 방식을 사용하였습니다.
액티비티에서 클릭이벤트를 처리하는 것과, 어댑터에서 클릭이벤트를 처리하는 것, 둘 모두 공통 코드를 사용합니다.
Bundle extras =
new
Bundle();
extras.putString(
"title"
, data.getTitle());
extras.putString(
"description"
, data.getDescription());
extras.putInt(
"color"
, data.getColor());
Intent intent =
new
Intent(
this
, ItemClickExampleNextActivity.
class
);
intent.putExtras(extras);
이 코드는 액티비티의 onItemClick 메소드와, 어댑터의 onClick 메소드에 공통적으로 사용되었습니다.
Bundle로 데이터를 넣을 공간을 만들고 데이터를 넣습니다. 그리고 이 Bundle을 다시 Intent에 넣습니다.
이때 데이터는
key - value 방식으로 넣어줍니다.
나중에 데이터를 꺼낼때도 여기서 사용한
key 를 이용해 꺼내면 됩니다.
Intent는 현재의 액티비티와, 타겟 액티비티(이동할 목표가 되는 액티비티)를 지정합니다.
그리고 위에서 만든 Bundle을 가지고 있게 됩니다.
그리고 마지막으로 startActivity 메소드를 통해 액티비티를 실행합니다. 이제 이동된 액티비티에서는 이전 액티비티에서 건내준 데이터를 꺼내서 처리를 하면 됩니다.
String title = getIntent().getStringExtra(
"title"
);
String description = getIntent().getStringExtra(
"description"
);
int
color = getIntent().getIntExtra(
"color"
, Color.WHITE);
위에서 사용한 key로 각 데이터 타입에 맞게 선언된 변수에, 데이터를 꺼내서 넣어줍니다.
이렇게 꺼낸 데이터는 각자 처리하려는 프로그램의 목적에 맞게 처리해 주면 됩니다.
이 예제에서는 해당 데이터를 이용해 액티비티의 배경색을 변경하고, 알럿다이얼로그를 생성해보았습니다.
접기