Android 2022-07-28 오전수업

Have a good one!·2022년 7월 28일
0

인공지능사관학교

목록 보기
8/13

Button Event Handling

activity_main.xml을 통한 Event handler연결이 아닌, MainActivity.java를 통하여 Button Handling하기.

기존 activity_main.xml에서 button view에 연결된 onClick Event에 연결하는 방식이 아닌 MainActivity.java에서 Click Evnet handling을 hooking하는 방식으로 수정하기.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

// click event 처리하는 곳.
    public void onClick_red_btn(View view){
        ConstraintLayout con_layout = findViewById(R.id.lay_con);
        con_layout.setBackgroundColor(Color.parseColor("red"));
    }

// click event 처리하는 곳.
    public void onClick_yello_btn(View view){
        ConstraintLayout con_layout = findViewById(R.id.lay_con);
        con_layout.setBackgroundColor(Color.parseColor("yellow"));
    }

// click event 처리하는 곳.
    public void onClick_green_btn(View view){
        ConstraintLayout con_layout = findViewById(R.id.lay_con);
        con_layout.setBackgroundColor(Color.parseColor("green"));
    }
}

이 부분을 다음과 같이 수정합니다.
MainActivity Class에서 View.OnClickListener 인터페이스를 implements구문으로 추가 합니다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

아래와 같이 빨간 줄이 나오면, 추상 Method를 구현하기 위하여,
implement methods를 선택한다.

여기서 그냥 OK

그러면 Override된 method가 생김.

onClick() 부분에 Event Handling을 하도록 Controll 코드를 구현.

    @Override
    public void onClick(View view) {
        // 1. 어떤 버튼을 클릭했는지 알아야 합니다.
        // view.getID로 알 수 있다.
        Log.d("내꺼", "onClick: "+ view.getId());
        switch (view.getId()){
            case R.id.red_button:
                onClick_red_btn(view);
                break;
            case R.id.yello_button:
                onClick_yello_btn(view);
                break;
            case R.id.green_button:
                onClick_green_btn(view);
                break;
            default:
                break;
        }
    }

MainActivity class부분도 다음과 같이 변경.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // button control을 위한 member variable추가.
    Button redButton, yellButton, greenButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //View객체를 member variable과 연결하기.
        redButton = findViewById(R.id.red_button);
        yellButton = findViewById(R.id.yello_button);
        greenButton = findViewById(R.id.green_button);
        //setOnClickListener 를 통해서 onClick 매서르를 사용하도록 함.
        redButton.setOnClickListener(this);
        yellButton.setOnClickListener(this);
        greenButton.setOnClickListener(this);
    }

결과,

Button을 누르면 색이 바뀌도록 Button control이 가능하다.

계산기 만들기

계산기 layout먼저 만들기

MainActivity.java 에서 Touch EventHandling전부 다 하기

MainActivity Class 수정

View.OnClickListener 인터페이스를 상속받은다음,
setOnClickListner를 통해 해당 MainActivity Class에서 Listener등록을 한다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button btn_add, btn_sub, btn_mul, btn_div;
    TextView text_num1, text_num2, text_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_add = findViewById(R.id.btn_add);
        btn_sub = findViewById(R.id.btn_sub);
        btn_mul = findViewById(R.id.btn_mul);
        btn_div = findViewById(R.id.btn_div);

        // connect view_component with member variable.
        btn_add.setOnClickListener(this);
        btn_sub.setOnClickListener(this);
        btn_mul.setOnClickListener(this);
        btn_div.setOnClickListener(this);
        
        text_num1 = findViewById(R.id.TextNumber_num1);
        text_num2 = findViewById(R.id.TextNumber_num2);
        text_result = findViewById(R.id.TextNumber_result);

OnClick() 정의

Override된 Interface내 Abstract method - OnClick() 함수를 정의한다. Event가 발생히 동작을 정의하면 된다.

    @Override
    public void onClick(View view) {
        Integer num1 = Integer.parseInt(text_num1.getText().toString());
        Integer num2 = Integer.parseInt(text_num2.getText().toString());

        switch (view.getId()){
            case R.id.btn_add:
                Log.d("내꺼", "onClick:"+num1+" + "+num2);
                text_result.setText(Integer.toString(num1+num2));
                break;
            case R.id.btn_sub:
                Log.d("내꺼", "onClick:"+num1+" - "+num2);
                text_result.setText(Integer.toString(num1-num2));
                break;
            case R.id.btn_mul:
                Log.d("내꺼", "onClick:"+num1+" * "+num2);
                text_result.setText(Integer.toString(num1*num2));
                break;
            case R.id.btn_div:
                Log.d("내꺼", "onClick:"+num1+" / "+num2);
                text_result.setText(Double.toString(num1/(double)num2));
                break;
            default:
                break;
        }
    }

(다른방법) 익명 OnClickListener 구현 방법.

MainActivity class수정.

  • View.OnClickListener interface 상속을 삭제한다.
  • Listenr등록 (setOnClickListener(this))을 삭제한다.
  • Override한 Onclick() 함수도 삭제한다.
  • setOnClickListener의 파라메터로 new View.OnClickListener(){} 을 추가한다.
  • 파라메터로 생성된 Stub class내 Override된 OnClick()안에 Button Control 코드를 작성한다.
//public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
public class MainActivity extends AppCompatActivity {
    Button btn_add, btn_sub, btn_mul, btn_div;
    TextView text_num1, text_num2, text_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_add = findViewById(R.id.btn_add);
        btn_sub = findViewById(R.id.btn_sub);
        btn_mul = findViewById(R.id.btn_mul);
        btn_div = findViewById(R.id.btn_div);

/*        // connect view_component with member variable.
        btn_add.setOnClickListener(this);
        btn_sub.setOnClickListener(this);
        btn_mul.setOnClickListener(this);
        btn_div.setOnClickListener(this);*/

        text_num1 = findViewById(R.id.TextNumber_num1);
        text_num2 = findViewById(R.id.TextNumber_num2);
        text_result = findViewById(R.id.TextNumber_result);

        // 이벤트 적용 세번째 방법 --> 익명 클래스 구현.
        // 인터페이스인 리스터를 직접적으로 버튼에 구현하는 방식이다.
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO: something..
                Integer num1 = Integer.parseInt(text_num1.getText().toString());
                Integer num2 = Integer.parseInt(text_num2.getText().toString());
                Log.d("내꺼", "onClick:"+num1+" + "+num2);
                text_result.setText(Integer.toString(num1+num2));
            }
        });

    }

Activity 추가하기

Activity 추가하기

우선 아래와 같이 추가해 보자.

아래와 같이 파일이 추가된다.

profile
Have a good one!

0개의 댓글