1. 콜백 메소드 재정의
화면을 터치하면 발생하는 이벤트
별다른 레이아웃은 작성하지 않았다.
에뮬레이터에서는 마우스로 화면을 클릭하면 되고,
폰에서는 손가락으로 터치하면 이벤트가 발생된다.
여기서 사용되는 이벤트는 Toast 메시지를 화면에 띄우는것으로 하였다.
HandleEvent.java
- package com.example.eventhandle;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Toast;
- public class HandleEvent extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(vw);
- }
- @Override
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- {
- {
- super(context);
- }
- public boolean onTouchEvent(MotionEvent event)
- {
- super.onTouchEvent(event);
- if(event.getAction() == MotionEvent.ACTION_DOWN)
- {
- Toast.makeText(HandleEvent.this, "Touch Event Received", 1).show();;
- return true;
- }
- return false;
- }
- }
- }
View클래스로부터 MyView 클래스를 파생시켜 onTouchEvent Method를 재정의했다.
슈퍼클래스의 Method를 직접 수정할 수는 없으니 일단 상속부터 받아야한다.
재정의된 Method는 super의 Method를 호출하여 부모에게 처리 기회를 먼저 제공하는 것이 보편적이다.
event 인수로 사용자가 화면을 눌렀는지, 누른채로 이동하는지 등의 상세한 정보가 전달되는데 예제에서는 이 정보들을 사용하지 않으며
단순히 Toast로 이벤트 수신 여부만 확인하였다.
물론 onTouchEvent를 사용하는 이유는 어디를 눌렀는가에 따라 처리가 달라져야 한다.
핸들러는 이벤트를 처리했으면 true를 리턴하고 관심없는 이벤트인 경우 false를 리턴 한다.
예제의 경우 화면을 누를 때만 토스트를 열며 이동할 때나 뗄 때는 반응하지 않는다.
엑티비티의 onCreate 에서는 MyView를 컨텐트 뷰로 등록하므로 화면 전체를 MyView로 가득 채운다.
MyView가 onDraw를 처리하지 않으므로 화면에는 아무것도 그려지지 않는다.
2. 리스너 이벤트 구현
리스너(Listener)는 특정 이벤트를 처리하는 인터페이스다.
이름 그대로 이벤트 발생 여부에 귀를 기울이고 있는 객체라고 할 수 있다. 리스너에 대응되는 이벤트를 받는 단 하나의 메소드가 선언되어 있으며 모두 View 클래스의 이너 인터페이스로 선언되어있다.
대표적인 리스너 종류
View.OnTouchListner : boolean onTouch (View v, MotionEvent event)
View.OnKeyListener : boolean onKey (View v, int keyCode, KeyEvent event)
View.ClickListener : boolean onLongClick (View v)
View.OnFocusChangeListener : void onFocusChange (View v, boolean hasFocus)
이벤트를 처리하려면 리스너를 구현하는 클래스를 선언하고 그 객체를 생성해야 한다.
이벤트 리스너는 통상 특정 뷰에 의해 정의되는 것이므로 외부에 선언 할 필요없이 엑티비티 클래스 내부에 이너 클래스로 선언한다.
예제를 만들어 본다.
이 코드는 앞 예제와 마찬가지로 방법이 다를뿐, 실행 결과는 똑같이 나온다.
HandleEvent.java
- package com.example.eventhandle;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Toast;
- public class HandleEvent extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- // 3. 리스너 등록
- vw.setOnTouchListener(TouchListener);
- setContentView(vw);
- }
- // 1. 리스너 구현 클래스 선언
- {
- @Override
- {
- if (event.getAction() == MotionEvent.ACTION_DOWN)
- {
- Toast.makeText(HandleEvent.this, "Touch Event Received", 1).show();
- return true;
- }
- return false;
- }
- }
- // 2. 리스너 객체 생성
- TouchListenerClass TouchListener = new TouchListenerClass();
- }
// 1. 리스너를 구현하는 클래스를 선언하고 추상 메소드를 구현한다.
// 2. 리스너 객체 TouchListener를 선언 및 생성한다.
// 3. 준비된 리스너 객체를 뷰의 이벤트와 연결한다.
뷰에서 터치 이벤트가 발생하면 setOnTouchListener 메소드로 등록한 리스너 객체의 onTouch 핸들러가 호출된다.
onTouch 메소드로 이벤트와 관련된 정보가 event인수로 전달된다.
또한, 리스너는 여러 뷰에 의해 공유될 수 있으므로 어떤 객체에서 발생한 ㅇ니벤트인지 v 인수로 전달받는다.
콜백은 특정 클래스에 소속되므로 이벤트를 받는 객체가 정해져있는데 리스너는 임의의 뷰에 대한 이벤트를 받을 수 있으므로,
반드시 v를 전달받아야 한다.
3. 엑티비티가 리스너 구현
안드로이드 프로젝트에는 최소 한개의 액티비티가 존재한다.
엑티비티가 리스너 인터페이스를 구현하는것도 가능하다.
엑티비티는 Activity클래스를 상속받지만 인터페이스는 개수에 상관없이 얼마든지 구현할 수 있다.
- package com.example.eventhandle;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Toast;
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- vw.setOnTouchListener(this);
- setContentView(vw);
- }
- @Override
- if (event.getAction() == MotionEvent.ACTION_DOWN)
- {
- Toast.makeText(HandleEvent.this, "Touch Event Received", 1).show();
- return true;
- }
- return false;
- }
- }
4. 뷰가 리스너 구현
뷰도 리스너를 구현할 수 있다.
엑티비티나 뷰 둘 다 클래스이므로 임의의 인터페이스를 구현할 수 있다.
- package com.example.eventhandle;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Toast;
- public class HandleEvent extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- MyView vw = new MyView(this);
- vw.setOnTouchListener(vw);
- setContentView(vw);
- }
- {
- {
- super(context);
- }
- if (event.getAction() == MotionEvent.ACTION_DOWN)
- {
- Toast.makeText(HandleEvent.this, "Touch Event Received", 1).show();
- return true;
- }
- return false;
- }
- }
- }
5. 익명 이너 클래스 이용
- package com.example.eventhandle;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.widget.Toast;
- public class HandleEvent extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- vw.setOnTouchListener(TouchListener);
- setContentView(vw);
- }
- @Override
- {
- if (event.getAction() == MotionEvent.ACTION_DOWN)
- {
- Toast.makeText(HandleEvent.this, "Touch Event Received", 1).show();
- return true;
- }
- return false;
- }
- };
- }
출처 : 안드로이드 프로그래밍 정복 (김상형 저) - 한빛미디어
'DEVELOPMENT > ANDROID' 카테고리의 다른 글
[android] 간단한 버튼 이벤트( XML 사용 ) (0) | 2014.03.25 |
---|---|
[android] TableLayout 기본 폼 (0) | 2014.03.18 |
[android] FrameLayout (0) | 2014.03.12 |
[android] AbsoluteLayout (0) | 2014.03.12 |
[android] RelativeLayout (상대 레이아웃) (0) | 2014.03.12 |