이벤트 (Event)
이벤트를 받아서 처리하는 각각의 방법들에 대해서 다룬다.
1. 콜백 메서드 재정의
가장 쉬운 방법으로 상속을 받아서 해당 callback
함수를 재정의해서 사용하는 방식이다.
단점
- 메서드 재정의하기 위해 반드시 슈퍼 클래스를 상속받아야 한다.
MyButton
등을 매번 만들어야 하는 번거로움이 있다. - 모든 이벤트에 대해서 콜백 메서드가 존재하는 것은 아니다.
Code
//* 1.핸들러 메소드 재정의 - 상속을 받아야만 재정의 가능하다.
public class HandleEvent extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new MyView(this);
setContentView(vw);
}
class MyView extends View {
public MyView(Context context) {
super(context);
}
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(HandleEvent.this,"Touch Event Received",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
}
2. 리스너 인터페이스 구현
3. 액티비티가 리스너 구현
4. 뷰가 리스너 구현
5. 익명 내부 클래스 사용
2번 째 방법에서 파생된 기법으로 리스너 하나를 위해 클래스를 일일이 선언하기 번거롭다는 점을 해결한 것이다.TouchListenerClass
는 onTouch
메서드 구현을 위한 것이며 오로지 TouchListener
객체 하나만을 위해 선언한 것이다.
더 이상의 메서드를 추가할 필요도 없고 객체를 두 개 이상 만들 필요도 없다.
객체 지향 언어이다 보니 메서드가 홀로 존재할 수 없으며 클래스 안에 넣어야 하고 객체를 생성한 후 등록하는 번거러운 과정을 거쳐야 한다.
자바는 이런 경우를 위해 언어 차원에서 익명 내부 클래스라는 문법을 제공 한다.
상위 클래스나 인터페이스의 메서드 하나를 재정의하기 위해 클래스를 선언하는 경우, 그리고 그 클래스의 객체가 단하나만 필요한 경우는 굳이 클래스를 선언할 필요 없이 상속과 재정의를 동시에 할 수 있다.
익명 클래스의 구현 예
public class HandleEvent extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new View(this);
vw.setOnTouchListener(TouchListener);
setContentView(vw);
}
View.OnTouchListener TouchListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(HandleEvent.this,"Touch Event Received",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
};
}
인터페이스의 인스턴스인 것 처럼 보이지만 실제로는 그렇지 않다.
인터페이스 자체는 구현이 없으므로 객체를 생성하지 못하기 때문이다.
익명 내부 클래스를 정의하는 문법을 간략하게 소개하면 다음과 같다.
# 축약된 코드
Interface obj = new Interface(){
메서드 구현
};
6. 익명 내부 클래스의 임시 객체 사용
public class HandleEvent extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new View(this);
vw.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(HandleEvent.this,"Touch Event Received",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
setContentView(vw);
}
}
5번과의 개념적 차이는 아래와 같다.
# 이름 있는 객체 사용
Class obj = new Class();
Method(obj);
# 임시 객체 사용
Method (new Class());
임시 객체를 사용하면 클래스 선언
, 객체 생성문
이 필요 없으므로 액티비티가 생성될 때인 onCreate
에서 이벤트 등록 및 구현이 모두 가능하여 코드가 아주 짧아진다.
7. Java8에서의 Lambda를 이용한 방법
https://mayojava.github.io/android/java/using-java8-lambda-expressions-in-android/
'Computer Science > Android Application' 카테고리의 다른 글
Activity (0) | 2017.08.16 |
---|---|
쓰레드 (Thread) (0) | 2017.08.04 |
Gradle (0) | 2016.06.03 |
Android Plot Libraries (0) | 2016.01.22 |
Android wear app (0) | 2015.08.25 |