안드로이드 위젯의 이벤트를 처리하는 4가지 방법 - 리스너 인터페이스 구현
클릭 이벤트에 대해서는 콜백 메서드가 정의되어 있지 않으며 반드시 리스너로 이벤트를 받아서 처리해야 한다. 맨아래에 레이아웃 파일이 있다.
방법 1 : findViewById 메서드로 xml 레이아웃에 정의된 R.id.apple 버튼 객체를 찾고 임시 리스너 객체를 생성하여 버튼의 setOnClickListener 메서드로 등록을 한다. 어렵지만 꼭 알아두어야 할 문법~
package exam.andexam;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
// 임시 객체로 핸들러 만들기
public class C06_Fruit extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c06_fruit);
Button btnApple=(Button)findViewById(R.id.apple);
btnApple.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
TextView textFruit=(TextView)findViewById(R.id.fruit);
textFruit.setText("Apple");
}
});
Button btnOrange=(Button)findViewById(R.id.orange);
btnOrange.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
TextView textFruit=(TextView)findViewById(R.id.fruit);
textFruit.setText("Orange");
}
});
}
}
방법 2 : 액티비티가 implements View.OnClickListener 를 통하여 OnClickListener 인터페이스를 직접 구현하도록 하였다. 리스너가 액티비티 자신인 this 가 된다.
콜백은 특정 뷰 클래스 소속이므로 이벤트 발생 대상이 정해져 있다. 그러니 리스너는 여러 위젯(심지어 다른 종류의 위젯끼리도)에 의해 공유될 수 있으므로 대상 뷰가 누구인지 전달 받아야 한다. 뷰를 전달해 주고 void onClick(View v) 뷰의 getId() 를 클릭 된 버튼을 알아내고 처리해 준다.
액티비티를 리스너로 사용한다는 것이 부담스러운 코드.
// 핸들러 통합하기 - 인터페이스 구현
public class C06_Fruit extends Activity implements View.OnClickListener {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c06_fruit);
Button btnApple=(Button)findViewById(R.id.apple);
btnApple.setOnClickListener(this);
Button btnOrange=(Button)findViewById(R.id.orange);
btnOrange.setOnClickListener(this);
}
public void onClick(View v) {
TextView textFruit=(TextView)findViewById(R.id.fruit);
switch (v.getId()) {
case R.id.apple:
textFruit.setText("Apple");
break;
case R.id.orange:
textFruit.setText("Orange");
break;
}
}
}
방법 3 : mClickListener 멤버는 View.OnClickListener 인터페이스를 구현하는 익명 클래스 타입으로 선언하고, 마찬가지로 onClick(View v) 에서 처리해준다. 위젯의 리스너를 처리하는 가장 좋은 방법이자.
findViewById(R.id.apple).setOnClickListener(mClickListener);
findViewById(R.id.orange).setOnClickListener(mClickListener);
두 버튼의 클릭 리스너 등록 메서드로 mClickListener 멤버를 전달한다.
//위젯의 리스너를 처리하는 가장 좋은 방법
// 핸들러 통합하기 - 인터페이스 구현 멤버 객체
public class C06_Fruit extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c06_fruit);
findViewById(R.id.apple).setOnClickListener(mClickListener);
findViewById(R.id.orange).setOnClickListener(mClickListener);
}
Button.OnClickListener mClickListener = new View.OnClickListener() {
public void onClick(View v) {
TextView textFruit=(TextView)findViewById(R.id.fruit);
switch (v.getId()) {
case R.id.apple:
textFruit.setText("Apple");
break;
case R.id.orange:
textFruit.setText("Orange");
break;
}
}
};
}
마지막 방법
이벤트 리스너는 코드에서 작성하는 것이 원칙이지만 클릭 이벤트만은 예외적으로 XML 문서에서 onClick 속성으로 지정할 수 있다. xml 문서의 Button 엘리먼트 속성에 다음을 추가한다.
android.onClick="mOnClick"
코드에는 반드시 이 메서드가 있어야 하며, 클릭 이벤트 핸들러와 원형이 일치해야 한다.
코드를 구현하면
public class C06_Fruit2 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c06_fruit2);
}
public void mOnClick(View v) {
TextView textFruit=(TextView)findViewById(R.id.fruit);
switch (v.getId()) {
case R.id.apple:
textFruit.setText("Apple");
break;
case R.id.orange:
textFruit.setText("Orange");
break;
}
}
}
예제에 쓰인 Layout 파일 - xml 코드
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<TextView
android:id="@+id/fruit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffff00"
android:textSize="40sp"
android:text="과일"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/apple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/applename"
/>
<Button
android:id="@+id/orange"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/orangename"
/>
</LinearLayout>
</LinearLayout>
-끝-
'개발자 > Android' 카테고리의 다른 글
RGB 16진수 색상표 (0) | 2012.12.07 |
---|---|
옵션메뉴 같은 각 액티비티에 공통인 코드 처리 방법 (0) | 2012.12.05 |
ActionBarSherlock을 쓰면서 TabActivity를 (0) | 2012.12.02 |
레이아웃에 설정된 이미지 뷰에 동적으로 비트맵 그림 넣기 - Bitmap Image insert in ImageView to Layout file set (0) | 2012.11.30 |
이클립스에서 폰트 크기 조절 방법 (2) | 2012.11.29 |
어댑터 뷰를 다루는 곳에서 에러 메시지 - import android.widget.AdapterView.OnItemSelectedListener; (0) | 2012.11.28 |
폰으로 업로드 타임아웃 - Faile to upload xxx.apk on device (0) | 2012.11.28 |
Eclipse - 이클립스에서 한글 깨질때 설정방법 (0) | 2012.11.28 |
더욱 좋은 정보를 제공하겠습니다.~ ^^