android OnClick 이벤트 적용하기

최고고·2022년 4월 27일
0

OnClick 이벤트 적용 방법 3가지

1. xml에 직접적으로 연결시키기

  • 클릭 되어졌을 때 실행할 메소드를 각각 정의해서 XML에 직접적으로 적용시키는 방식
    java파일에 메소드 작성하고

    온클릭메소드에 지정하기
    이 방법은 잘 안쓴다.

2. OnClickListener 인터페이스 상속받아 사용

  • 클릭 리스너를 상속받아서 onClick메소드를 구현하는 방식
  • 이벤트가 비슷한 경우에 많이 사용됨 (같은기능)
  • 자바파일에서 implements View.OnClickListener
    (배경색 바꾸는 예제 파일)
    btn_red.setOnClickListener(this);
    this: 현재클래스에 있는 onCLick메소드를 사용한다
  • 어떤버튼이 클릭되어졌는지 판단해야됨->뷰라는 객체를 통해 알 수있음
    단순히 btn_ ㅇㅇㅇㅇ는 버튼 객체이다
    버튼에 대한 id 값이 필요하므로 R.id.btn (지정한id값)으로 id 값을 가져와줘야됨
package com.example.androidexam;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.solver.state.State;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class ChangeColor extends AppCompatActivity implements View.OnClickListener {
    ConstraintLayout background;
    Button btn_red,btn_green,btn_blue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 어느 XML파일을 실행 할 것인지 정해주는 부분
        setContentView(R.layout.activity_change_color);
        background = findViewById(R.id.background);
        btn_blue=findViewById(R.id.btn_blue);
        btn_red=findViewById(R.id.btn_red);
        btn_green=findViewById(R.id.btn_green);
        btn_red.setOnClickListener(this);
        btn_blue.setOnClickListener(this);
        btn_green.setOnClickListener(this);
        btn_red.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                background.setBackgroundColor(Color.parseColor("red"));
            }
        });

    }



    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.btn_blue){
            background.setBackgroundColor(Color.parseColor("blue"));
        } else if(view.getId()==R.id.btn_red){
            background.setBackgroundColor(Color.parseColor("red"));
        } else if(view.getId()==R.id.btn_green){
            background.setBackgroundColor(Color.parseColor("green"));
        }
    }
}

계산기 화면 구현

사용자가 EditText에 입력하고 버튼 클릭시 TextView 에 계산 결과 나오게

package com.example.androidexam;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Calculator extends AppCompatActivity implements View.OnClickListener {

    TextView result;
    EditText num1,num2;
    Button btn_plus2, btn_minus2, btn_multi, btn_divi;
    int result_;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculator);
        // setContentView 다음 findView 가 이루어짐
        result = findViewById(R.id.result);
        num1 = findViewById(R.id.num1);
        num2 = findViewById(R.id.num2);
        btn_plus2 = findViewById(R.id.btn_plus2);
        btn_minus2 = findViewById(R.id.btn_minus2);
        btn_multi = findViewById(R.id.btn_multi);
        btn_divi = findViewById(R.id.btn_divi);

        btn_plus2.setOnClickListener(this);
        btn_minus2.setOnClickListener(this);
        btn_multi.setOnClickListener(this);
        btn_divi.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int num3 = Integer.parseInt(num1.getText().toString());
        int num4 = Integer.parseInt(num2.getText().toString());

        if(view.getId()==R.id.btn_plus2){
            result_ = num3+num4;
        }else if(view.getId()==R.id.btn_minus2){
            result_ = num3-num4;
        }else if(view.getId()==R.id.btn_multi){
            result_ = num3*num4;
        }else if(view.getId()==R.id.btn_divi){
            result_ = num3/num4;
        }
        result.setText("연산결과 : "+ result_);
    }
}

3. Listener Class를 익명Class로 정의

  • 전혀 다른 기능을 각 View에 적용시키고 싶을 때 사용함

  • 각 버튼의 기능이 전혀 다르고, 로직이 길어질때

  • 리스너 인터페이스는 익명클래스로 정의해서 사용함 임시적으로 만듦

  • 리스너를 입시적으로 만들어 버튼에 적용시킴

  • 이전, 다음 버튼 클릭시 이미지 바뀌게 만들기
    이미지를 drawable 폴더에 넣어준다.
    이미지 파일은 res\drawable 에 넣어줘야됨 경로 끝이 24로 되어있는거는 안됨

아래 같은 제약조건



package com.example.myapplication0504;

import androidx.appcompat.app.AppCompatActivity;

import android.location.GnssAntennaInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.util.Random;

public class MainActivity extends AppCompatActivity{
    Button btn_before, btn_after;
    ImageView imagepoke;

    //이미지를 관리할 배열을 만들어줌
    int[] imgArr = {R.drawable.poke1,R.drawable.poke2,R.drawable.poke3};
    // 이미지배열의 인덱스 변수 인덱싱해줌
    int index = 0;

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

        btn_before = findViewById(R.id.btn_before);
        btn_after = findViewById(R.id.btn_after);
        imagepoke = findViewById(R.id.imagepoke);

        //이벤트 적용 3번째방법 : 각 버튼의 기능이 전혀 다르고, 로직이 길어질때
        //리스너 인터페이스는 익명클래스로 정의해서 사용함 임시적으로 만듦
        //리스너를 입시적으로 만들어 버튼에 적용시킴


        btn_after.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 다음버튼 클릭 되었을 때 랜덤 이미지가 출력 되게
                Random ran = new Random();
                int num = ran.nextInt(3);     //nextInt(숫자): 숫자-1 중 랜덤 수 추출
                imagepoke.setImageResource(imgArr[num]);
               /* index++;
                if(index==3) {
                    index = 0;
                }
                imagepoke.setImageResource(imgArr[index]);*/
            }
        });
        btn_before.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                index--;
                imagepoke.setImageResource(imgArr[index]);
            }
        });

    }




    //인터페이스 상속받아 이벤트 적용하는 방법 : 각버튼의 기능이 비슷할때 사용됨  간단로직, 사칙연산 등
/*    @Override
    public void onClick(View view) {
            //클릭한 정보를 가지고있는 객체 view
        if (view.getId()==R.id.btn_before){
            index--;
            imagepoke.setImageResource(imgArr[index]);

        } else if(view.getId()==R.id.btn_after){
            index++;
            if(index==3) {
                index = 0;
            }
                imagepoke.setImageResource(imgArr[index]);
            }
        }

    */

    //마지막 버튼을 클릭하면 첫번째 이미지로 돌아오게ㅔ끔 만들어주세요





    // xml로 사용하는 방법
/*    public void change(View view){
        index++;

        imagepoke.setImageResource(imgArr[index]);   //해당하는 이미지로 바꿔줌 저장시킴->매개변수는 int타입
        // 배열에서 차례대로 가져와줌
    }

    public void before(View view){
        index--;
        imagepoke.setImageResource(imgArr[index]);
    }*/
}

주사위 게임

btn_play 버튼 누르면 사용자, 컴퓨터의 주사위 눈이 랜덤으로 바뀌고 텍스트뷰인 스코어가 바뀜
먼저 10점이 나면 토스트 메시지가 나왔다 사라짐
토스트 알림창 띄우는 법 (띄워졌다가 사라지는 알림창)
Toast.makeText(파일명.this,"띄울메시지 내용 입력",Toast.LENGTH_LONG(길게할지 결정)).show();

package com.example.myapplication0504;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class DiceGame extends AppCompatActivity {
    Button btn_play;
    ImageView img_user, img_com;
    TextView score;

    int[] diceArray = {R.drawable.dice1,R.drawable.dice2,R.drawable.dice3,R.drawable.dice4,
            R.drawable.dice5,R.drawable.dice6};
    int index = 0;
    int user=0; int com = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dice_game);
        img_com = findViewById(R.id.img_com);
        img_user = findViewById(R.id.img_user);
        btn_play = findViewById(R.id.btn_play);
        score = findViewById(R.id.score);

        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Random rd = new Random();
                int num1 = rd.nextInt(6);
                img_user.setImageResource(diceArray[num1]);
                Random rd2 = new Random();
                int num2 = rd2.nextInt(6);
                img_com.setImageResource(diceArray[num2]);

                if (num1 > num2) {
                    user++;
                    if(user>=10){
                        //토스트 알림창 띄우는 법 (띄워졌다가 사라지는 알림창)
                        Toast.makeText(DiceGame.this,"user 승리입니다.",Toast.LENGTH_LONG).show();
                    }
                } else if(num2>num1){
                    com++;
                    if(com>=10){
                        Toast.makeText(DiceGame.this,"컴퓨터의 승리입니다.",Toast.LENGTH_LONG).show();

                    }
                }
                score.setText(user + ":" + com);


            }
        });

    }




}

0개의 댓글