Blinking My Melody

[계산기 만들기] 버튼 이벤트를 처리하는 4가지 방법

2019. 3. 16. 19:52

1. 익명 클래스 생성 후 이벤트 리스너 사용


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
public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button buttonP, buttonM, buttonG, buttonN;
    private EditText one, two;
 
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.textView);
        one = findViewById(R.id.one);
        two = findViewById(R.id.two);
 
        buttonP = (Button) findViewById(R.id.buttonP);
        buttonP.setOnClickListener(new Button.onClickListener() {
            @Override
            public void onClick(View view) {
                int n1 = Integer.parseInt(one.getText().toString());
                int n2 = Integer.parseInt(two.getText().toString());
                textView.setText(Integer.toString(n1 + n2));
            }
        });
        buttonM = (Button) findViewById(R.id.buttonM);
        buttonM.setOnClickListener(new Button.onClickListener() {
            @Override
            public void onClick(View view) {
                int n1 = Integer.parseInt(one.getText().toString());
                int n2 = Integer.parseInt(two.getText().toString());
                textView.setText(Integer.toString(n1 - n2));
            }
        });
        buttonG = (Button) findViewById(R.id.buttonG);
        buttonG.setOnClickListener(new Button.onClickListener() {
            @Override
            public void onClick(View view) {
                int n1 = Integer.parseInt(one.getText().toString());
                int n2 = Integer.parseInt(two.getText().toString());
                textView.setText(Integer.toString(n1 * n2));
            }
        });
        buttonN = (Button) findViewById(R.id.buttonN);
        buttonN.setOnClickListener(new Button.onClickListener() {
            @Override
            public void onClick(View view) {
                int n1 = Integer.parseInt(one.getText().toString());
                int n2 = Integer.parseInt(two.getText().toString());
                textView.setText(Integer.toString(n1 / n2));
            }
        });
    }
}
 
// 버튼의 개수가 적거나, 버튼들 간의 연관성이 적은 경우
// 이벤트 핸들러 함수 내에서 익명 클래스 외부의 변수를 참조하지 않는 경우
// 간단한 Button 클릭 이벤트 테스트 코드를 작성하는 경우 
cs




2. 생성해 놓은 익명 클래스 참조를 이벤트 리스너로 사용


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
public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button buttonP, buttonM, buttonG, buttonN;
    private EditText one, two;
 
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button.onClickListener onClickListener = new Button.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView = (TextView) findViewById(R.id.textView);
                one = (EditText) findViewById(R.id.one);
                two = (EditText) findViewById(R.id.two);
 
                switch (view.getId()) {
                    case R.id.buttonP :
                        int n1 = Integer.parseInt(one.getText().toString());
                        int n2 = Integer.parseInt(two.getText().toString());
                        textView.setText(Integer.toString(n1 + n2));
                        break;
                    case R.id.buttonM : 
                        int n3 = Integer.parseInt(one.getText().toString());
                        int n4 = Integer.parseInt(two.getText().toString());
                        textView.setText(Integer.toString(n1 - n2));
                        break;
                    case R.id.buttonP :
                        int n5 = Integer.parseInt(one.getText().toString());
                        int n6 = Integer.parseInt(two.getText().toString());
                        textView.setText(Integer.toString(n1 * n2));
                        break;
                    case R.id.buttonN :
                        int n7 = Integer.parseInt(one.getText().toString());
                        int n8 = Integer.parseInt(two.getText().toString());
                        textView.setText(Integer.toString(n1 / n2));
                        break;
                }
            }
        };
 
        buttonP = (Button)findViewById(R.id.buttonP);
        buttonP.setOnClickListener(onClickListener);
        buttonM = (Button)findViewById(R.id.buttonM);
        buttonM.setOnClickListener(onClickListener);
        buttonG = (Button)findViewById(R.id.buttonG);
        buttonG.setOnClickListener(onClickListener);
        buttonN = (Button)findViewById(R.id.buttonN);
        buttonN.setOnClickListener(onClickListener);
    }
}
 
// 버튼이 여러 개 존재하고 버튼들 간의 연관성이 많은 경우
// 이벤트 핸들러 함수 내에서 익명 클래스 외부의 변수를 참조하지 않는 경우
// 추후 또 다른 버튼을 추가하여 사용할 가능성이 높은 경우
cs




3. 이벤트 리스너 인터페이스를 implements하는 이벤트 리스너 클래스 생성


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
public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button buttonP, buttonM, buttonG, buttonN;
    private EditText one, two;
 
    class BtnOnClickListener implements Button.OnClickListener {
        @Override
        public void onClick(View view) {
            textView = findViewById(R.id.textView);
            one = findViewById(R.id.one);
            two = findViewById(R.id.two);
            switch (view.getId()) {
                case R.id.buttonP :
                    int n1 = Integer.parseInt(one.getText().toString());
                    int n2 = Integer.parseInt(two.getText().toString());
                    textView.setText(Integer.toString(n1 + n2));
                    break;
                case R.id.buttonM : 
                    int n3 = Integer.parseInt(one.getText().toString());
                    int n4 = Integer.parseInt(two.getText().toString());
                    textView.setText(Integer.toString(n1 - n2));
                    break;
                case R.id.buttonP :
                    int n5 = Integer.parseInt(one.getText().toString());
                    int n6 = Integer.parseInt(two.getText().toString());
                    textView.setText(Integer.toString(n1 * n2));
                    break;
                case R.id.buttonN :
                    int n7 = Integer.parseInt(one.getText().toString());
                    int n8 = Integer.parseInt(two.getText().toString());
                    textView.setText(Integer.toString(n1 / n2));
                    break;
            }
        }
    }    
 
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        BtnOnClickListener onClickListener = new BtnOnClickListener();
 
        buttonP = findViewById(R.id.buttonP);
        buttonP.setOnClickListener(onClickListener);
        buttonM = findViewById(R.id.buttonM);
        buttonM.setOnClickListener(onClickListener);
        buttonG = findViewById(R.id.buttonG);
        buttonG.setOnClickListener(onClickListener);
        buttonN = findViewById(R.id.buttonN);
        buttonN.setOnClickListener(onClickListener);
    }
}
 
// 명시적으로 이벤트 리스너 인터페이스를 상속하여 만듦으로 코드의 가독성을 높이고 싶은 경우
// 추후 또 다른 버튼을 추가하여 사용할 가능성이 높은 경우
cs

 



4. Activity에서 이벤트 리스너를 implements해서 사용


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
package com.example.soyoung.widget;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView textView;
    private Button buttonP, buttonM, buttonG, buttonN;
    private EditText one, two;
 
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.textView);
        buttonP = findViewById(R.id.buttonP);
        buttonP.setOnClickListener(this);
        buttonM = findViewById(R.id.buttonM);
        buttonM.setOnClickListener(this);
        buttonG = findViewById(R.id.buttonG);
        buttonG.setOnClickListener(this);
        buttonN = findViewById(R.id.buttonN);
        buttonN.setOnClickListener(this);
        one = findViewById(R.id.one);
        two = findViewById(R.id.two);
    }
 
    @Override
    public void onClick(View view) {
        int n1, n2;
 
        if (view.getId() == R.id.buttonP) {
            n1 = Integer.parseInt(one.getText().toString());
            n2 = Integer.parseInt(two.getText().toString());
            textView.setText(Integer.toString(n1 + n2));
        }
 
        if (view.getId() == R.id.buttonM) {
            n1 = Integer.parseInt(one.getText().toString());
            n2 = Integer.parseInt(two.getText().toString());
            textView.setText(Integer.toString(n1 - n2));
        }
 
        if (view.getId() == R.id.buttonG) {
            n1 = Integer.parseInt(one.getText().toString());
            n2 = Integer.parseInt(two.getText().toString());
            textView.setText(Integer.toString(n1 * n2));
        }
 
        if (view.getId() == R.id.buttonN) {
            n1 = Integer.parseInt(one.getText().toString());
            n2 = Integer.parseInt(two.getText().toString());
            textView.setText(Integer.toString(n1 / n2));
        }
    }
}
 
// 이벤트 핸들러 함수에서 많은 수의 Activity 멤버를 액세스해야 하는 경우
// Activity 내부의 버튼들에 한 클릭 이벤트를 한 곳에서 처리하고 싶은 경우
// 익명 클래스 또는 별도의 이벤트 리스너를 만들고 싶지 않은 경우
cs