반응형
/*
핸들러의 우선순위
핸들러가 동시 콜 되는 것을 막기위해 안드로이드는 아래와 같이 처리해두었다.
뷰의 리스너 -> 뷰의 onTouchEvent callback 메서드 -> 액티비티의 onTouchEvent callback 메서드
순서로 이벤트를 처리한다.
자세히보면 좁은 범위 -> 넓은 범위로 가게됨을 알 수 있다.
*/
package com.example.test;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 1. 콜백 이용
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new MyView(this);
setContentView(vw);
}
protected 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(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
}
package com.example.test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 2. 리스너 인터페이스 이용
public class MainActivity extends AppCompatActivity {
TouchListenerClass TouchListener = new TouchListenerClass();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new View(this);
vw.setOnTouchListener(TouchListener);
setContentView(vw);
}
class TouchListenerClass implements View.OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
}
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 3. 액티비티가 리스너 구현
/*
액티비티 자신이 View.OnTouchListener 선언문을 작성하여 액티비티가 직접 인터페이스를 구현하는 방법이다.
따라서 vw.setOnTouchListener에는 액티비티 자신인 this가 들어간다.
*/
public class MainActivity extends Activity implements View.OnTouchListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new View(this);
vw.setOnTouchListener(this);
setContentView(vw);
}
public boolean onTouch(View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 4. 뷰가 리스너 구현
/*
액티비티에서 바로 implements를 하는 것이 아닌 뷰 클래스를 하나 더 만들어 거기서 만들어낸다.
이렇게 하면 클래스 재사용이 유리해지고 액티비티가 깔끔해진다.(자기 스스로 처리하는 것 처럼 되기 때문에)
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView vw = new MyView(this);
vw.setOnTouchListener(vw);
setContentView(vw);
}
protected class MyView extends View implements View.OnTouchListener{
public MyView(Context context){
super(context);
}
public boolean onTouch(View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
}
}
package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 5. 익명 이너 클래스 사용
/*
액티비티에서 바로 implements를 하는 것이 아닌 뷰 클래스를 하나 더 만들어 거기서 만들어낸다.
이렇게 하면 클래스 재사용이 유리해지고 액티비티가 깔끔해진다.(자기 스스로 처리하는 것 처럼 되기 때문에)
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View vw = new View(this);
vw.setOnTouchListener(TouchListener);
setContentView(vw);
}
/*
일반적인 코드
class MyClass implements Interface {
// 구현
}
MyClass obj = new MyClass();
축약된 코드
Interface obj = new Interface() {
// 구현
}; // 변수 선언문이므로 문장의 끝은 ;
*/
private View.OnTouchListener TouchListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
};
}
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 6. 익명 이너 클래스의 임시 객체 사용
/*
5번 익명 이너 클래스에서
Class obj = new Class();
Method(obj);
에서
Method(new Class());
로 바꾼 형태(완전 람다 함수 형태)
*/
public class MainActivity extends Activity {
@Override
protected 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(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
setContentView(vw);
}
}
반응형
'Basic > Android' 카테고리의 다른 글
안드로이드 레이아웃(Android Layout) 종류와 사용 방법 (0) | 2019.07.11 |
---|---|
안드로이드 뷰(Android View)란? (0) | 2019.07.10 |
싱글턴 패턴 구현을 통한 검증 (0) | 2019.06.27 |
Android Support Annotations (0) | 2019.06.25 |
Android에서 Intent란? (2) | 2019.06.10 |