이벤트 처리
1. 폴링(polling)방식
-애플리케이션이 무한 루프를 돌면서 사용자의 입력을 기다리는 방식으로 cpudㅢ 파워를 엄청나게 낭비한다.(비추천)
2. 이벤트 구동(event-driven)방식
- 여러가지 방법이 있다. 대표적으로 두가지 방법
- 뷰 클래스의 이벤트 처리 메소드를 재정의하는 방법 (특수한 경우에만 사용)
- 이벤트를 처리하는 객체를 생성하여 이벤트를 처리하는 방법 (가장 일반적인 방법)
이벤트 처리 메소드 재정의
- View 클래스는 이벤트가 발생했을 경우에 호출되는 몇 개의 콜백 메소드(callback method)를 가지고 있다.
- View 객체에 어떤 액션이 발생하면 이들 콜백 메소드는 안드로이드 프레임워크에 의하여 호출된다.
- 단점 : 이 방법의 가장 큰문제점은 반드시 View 클래스를 상속받아야 한다는 것이다.
즉 TextEdit와 같이 이미 정의된 위젯을 사용할 때도 반드시 MyTextEdit와 같이 TextEdit를 상속한 클래스를 작성하여야 한다.
이는 상당히 번거로운 작업이다. 하지만 반대로 자신만의 커스텀 클래스를 작성할 때는 전혀 문제가 되지 않을 것이다.
- 주의 : onKeyDown()에서는 super 키워드를 이용하여서 부모 클래스의 이벤트 처리 메소드도 호출해야한다. 이렇게 하는 것이 좋은데 그이유는 부모 클래스도 이 이벤트를 받아서 처리하여야 하기 때문이다.
- 속성
메소드 |
설명 |
onKeyDown(int, KeyEvent) |
사용자가 키보드를 눌렀을 때 호출된다. |
onKeyUp(int, KeyEvent) |
사용자가 키에서 손을 뗐을 때 호출된다. |
onTrackballEvent(MotionEvent) |
사용자가 트랙볼을 움직였을 때 호출된다. |
onTouchEvent(MotionEvent) |
사용자가 화면을 터치했을 때 호출된다. |
onFocusChanged(boolean, int, Rect) |
뷰가 포커스를 얻거나 잃었을 경우에 호출된다. |
- ex)
class MyView extends View //우선 view 클래스를 상속받아서 myview 클래스를 정의한다. { .... boolean onKeyDown(){ ... return super.onKeyDown(keyCode, event); //이벤트를 처리하였으면 true를 반환 //처리하지 않았으면 false를 반환한다. } ... } |
이벤트 처리 객체 사용
- 좀 더 쉽게 이벤트를 처리하기 위하여 이벤트를 처리하는 객체를 별도로 생성한다.
- 또한 이벤트를 처리하는 콜백 메소드를 가지고 있어야 한다.
이벤트 리스너(event listener)
- 콜백 메소들을 정의된 인터페이스는 뷰클래 내부에 정의되어있다.
- 이벤트 리스너를 구현하는 클래스를 정의하고 이 클래스의 객체를 생성하여 위젯에 등록한다.
- 만약 위젯에 이벤트가 발생하면 등록된 이벤트 리스너 안의 콜백 메소드가 자동적으로 호출한다.
class MyClass { class Listener implements OnClickListener{ //인터페이스를 구현한 클래스 정의 public void onClick(View v){ ... } } Listener lis = new Listener(); //이벤트 리스너 객체 생성 Button.setOnClickListener(lis); //버튼에 이벤트 리스너 객체를 등록 ... } |
리스너 | 콜백 메소드 | 설명 |
View.OnClickListener | onClick() | 사용자가 어떤 항목을 터치하거나 내비게이션 키나 트랙볼로 항목으로 이 동한 후 에 엔터키를 눌러서 선택하면 호출된다. |
View.OnLongClickListener | onLongClick() | 사용자가 항목을 터치하여서 일정 시간 동안 그대로 누르고 있으면 발생한 다. |
View.OnFocusChangeListener | onFocusChange() | 사용자가 하나의 항목에서 다른 항목으로 포커스를 이동할 때 호출된다. |
View.OnKeyListener | onKey() | 포커스를 가지고 있는 항목 위에서 키를 눌렀다가 놓았을 때 호출된다. |
View.OnTouchListener | onTouch() | 사용자가 터치 이벤트로 간주되는 동작을 한 경우에 호출된다. |
View.OnCreateContextMenuListener | onCreateContextMenu() | 컨텍스트 메뉴가 구축되어 있는 경우에 호출된다. |
리스너 객체를 생성하는 방법
- 리스너 클래스를 내부 클래스로 정의한다.
- 리스너 클래스를 무명 클래스로 정의한다.
- 리스너 인터페이스를 액티비티클래스에 구현한다.
1. 내부 클래스로 처리하는 방법
- 클래스안에 정의된 클래스를 의미한다.
- 내부 클래스는 자신이 속해있는 클래스의 멤버들에 자유롭게 접근하여 사용할 수 있다는 큰 장점이 있다.
|
2. 무명 클래스로 처리하는 방법
- 클래스가 딱 한 번만 사용되는 경우에는 사실은 클래스에 이름을 붙일 필요가 없다.
- 임시 객체로 만드는 방법이 많이 사용된다.
- 클래스를 정의하면서 동시에 객체를 생성하게 된다.
- 한 번만 사용이 가능하다.
- 코드의 양을 줄일수 있는 장점도 있지만 반면에 표기법이 상당히 난해하다는 단점도 있다.
package com.example.administrator.myapplication; |
*참고
이벤트 리스너가 반환하는 값은 상당한 의미가 있다. 만약 true값을 반환하면 자신이 모든 처리를 완료햇다는 의미이다.
따라서 상위 클래스의 이벤트 처리 메소드는 호출되지 않는다. 하지만 false를 반환하면 처리를 환료하지 않았으므로 상위 이벤트 처리 메소드가 계속해서 처리할 수 있다. 이벤트 리스너가 true를 반환하는 것은 상위 이벤트 처리 메소드에 이벤트가 전파되는 것을 막는 의미가 있다.
3. 액티비티에 인터페이스를 구현하는 방법
- OnClickListener 인터페이스를 액태비티 클래스에 구현할 수도 있다.
package com.example.administrator.myapplication;
|
4. XML을 이용한 이벤트 처리
<?xml version="1.0" encoding="utf-8"?>
|
package com.example.administrator.myapplication; |
'안드로이드' 카테고리의 다른 글
액티비티와 인텐트 (0) | 2016.04.03 |
---|---|
이벤트 처리2 (0) | 2016.03.31 |
레이아웃 (0) | 2016.03.31 |
사용자 인터페이스 (UI) 기초 (0) | 2016.03.31 |
Error:Execution failed for task ':app:mergeDebugResources' (0) | 2016.03.29 |