티스토리 뷰

MFC에서 우리가 자주 사용하는 명령으로 메세지 핸들이 있었다.

이것은 사용자가 어떤 액션을 취할 때 마다. (예를들어 어떤 버튼을 클릭한다던지, 키보드의 어떤 키를 누른다던지 하는 등의) 메세지가 발생하여 해당 메세지의 핸들러가 미리 정의해놓은 행동을 하는 것이다.

이것이 안드로이드에도 다른 형태로 존재하는데 이름을 Listener라고 한다.

메세지핸들러와 같이 사용자의 액션이 발생하면 OS가 캐치하여, 듣고 있는 녀석들(리스너)에게 전달을 해주고, 리스너는 등록된 동작을 수행(콜백)하는 형식이라는 점이 MFC의 메세지 핸들과 매우 유사하다고 할 수 있다.

이 리스너를 사용하는 방식에는 크게 6가지 방법이 있다. 순서대로 분류해보자면


1. CALLBACK Method 재정의

2. View가 Listener 구현

3. Activity가 Listener 구현

4. Listener가 인터페이스 구현

5. 익명 내부클래스 사용

6. 익명 내부클래스의 임시 객체 사용 

이렇게 6가지 방법이라 할 수 있겠다. 예제를 통하여 하나씩 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
public class MainActivity extends ActionBarActivity implements  View.OnTouchListener {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        int style = LinearLayout.LayoutParams.MATCH_PARENT;
 
        LinearLayout.LayoutParams params;
        params = new LinearLayout.LayoutParams(style,style,1.0f);
 
        //-----------------------------------------------------------------//
 
        LinearLayout linear = (LinearLayout) findViewById(R.id.linear);
 
        View_1 v1 = new View_1(this);
        View_2 v2 = new View_2(this);
        View v3 = new View(this);
        View v4 = new View(this);
        View v5 = new View(this);
        View v6 = new View(this);
 
        v1.setBackgroundColor(Color.rgb(2552550));
        v2.setBackgroundColor(Color.rgb(2550255));
        v3.setBackgroundColor(Color.rgb(0255255));
        v4.setBackgroundColor(Color.rgb(25500));
        v5.setBackgroundColor(Color.rgb(02550));
        v6.setBackgroundColor(Color.rgb(00255));
 
 
        linear.addView(v1);
        linear.addView(v2);
        linear.addView(v3);
        linear.addView(v4);
        linear.addView(v5);
        linear.addView(v6);
 
        v1.setLayoutParams(params);
        v2.setLayoutParams(params);
        v3.setLayoutParams(params);
        v4.setLayoutParams(params);
        v5.setLayoutParams(params);
        v6.setLayoutParams(params);
 
        v2.setOnTouchListener(v2);
        v3.setOnTouchListener(this);
        v4.setOnTouchListener(new Listener_4());
 
        View.OnTouchListener listener_5;
        listener_5 = new View.OnTouchListener() {
 
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    Toast.makeText(MainActivity.this,"five",Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        };
 
        v5.setOnTouchListener(listener_5);
        v6.setOnTouchListener(new View.OnTouchListener()
        {
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    Toast.makeText(MainActivity.this,"six",Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });
    }
 
    class View_1 extends View  {
 
        public View_1(Context context) {
            super(context);
        }
 
        public boolean onTouchEvent(MotionEvent event) {
 
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                Toast.makeText(MainActivity.this,"one",Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
 
    class View_2 extends View implements View.OnTouchListener{
 
        public View_2(Context context) {
            super(context);
        }
 
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                Toast.makeText(MainActivity.this,"two",Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
 
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            Toast.makeText(MainActivity.this,"three",Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
 
    class Listener_4 implements View.OnTouchListener {
 
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                Toast.makeText(MainActivity.this,"four",Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
}
 
cs


주어진 예제는 LinearLayout에 뷰를 추가하여 눌렀을때 각각의 라인에 해당하는 토스트가 떠오르는 예제이다.

참고하여 공부해보자

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함