Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

쨍쨍

[Android Studio] 클릭 이벤트를 사용하는 4가지 방법 본문

프로그래밍 코드/Android Studio

[Android Studio] 클릭 이벤트를 사용하는 4가지 방법

이선선 2023. 5. 22. 20:23

클릭 이벤트를 사용하는 방법 ① 익명클래스 생성 )

쉽게 말하자면 익명 클래스 생성으로 리스너를 구현하여 등록하는 방법이다.

 

방법

public void InitializeView()
{
    btnred = (Button)findViewById(R.id.btn1);
    btnblue = (Button)findViewById(R.id.btn2);
    btngreen = (Button)findViewById(R.id.btn3);
    textView = (TextView)findViewById(R.id.textView);
}

InitializeView()코드를 사용해 각 뷰 위젯의 참조를 얻어온 후

public void SetListener() {
    btnred.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textView.setTextColor(Color.RED);
            // 버튼을 누르면 색이 빨강색으로 변경
            textView.setText("Red");
            // 버튼을 누르면 문구가 Red로 변경
        }
    });
}

setListener()함수에서 익명 클래스를 생성하여 setOnClickListener()함수를 통해 이벤트 리스너를 등록한다.

이때, View.OnClickListener()는 인자정보로 인터페이스를 상속받아 onClick()함수를 오버라이딩한 익명 클래스 객체를 넘겨준다.

 

전체 코드

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button btnred;
    Button btnblue;
    Button btngreen;
    TextView textView;

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

        this.InitializeView();
        this.SetListener();
    }
    public void InitializeView()
            // InitializeView()를 사용해 각 뷰 위젯의 참조를 얻어옴.
    {
        btnred = (Button)findViewById(R.id.btn1);
        btnblue = (Button)findViewById(R.id.btn2);
        btngreen = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }
    public void SetListener()
            // 익명 클래스를 생성하여 위젯의 리스너를 구현
    {
        btnred.setOnClickListener(new View.OnClickListener(){
            // setOnClickListener() 함수를 통해 이벤트 리스너를 등록
            @Override
            public void onClick(View view)
            {
                textView.setTextColor(Color.RED);
                // 버튼을 누르면 색이 빨강색으로 변경
                textView.setText("Red");
                // 버튼을 누르면 문구가 Red로 변경
            }
        });

        btnblue.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {
                textView.setTextColor(Color.BLUE);
                textView.setText("Blue");
            }
        });

        btngreen.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {
                textView.setTextColor(Color.GREEN);
                textView.setText("Green");
            }
        });
    }
}

익명 클래스를 생성하는 방법을 사용하면 특정 위젯(위 코드에선 버튼)이 어디서 처리되는지를 직관적으로 확인할 수 있다는 장점이 있다. 하지만 위젯의 개수가 늘어나면 늘어난 위젯을 모두 익명 클래스 객체를 생성해야 하기 때문에 코드가 복잡해질 수 있다는 단점이 있다. 따라서 위젯의 개수가 적거나, 뷰 위젯간의 연관성이 적을 때 사용된다.

 


클릭 이벤트를 사용하는 방법 ② 익명 클래스의 참조를 이벤트 리스너로 사용 )

방법 ①과 마찬가지로 익명 클래스를 이용하지만 뷰 위젯에 대한 이벤트 처리 구문이 한 개의 리스너에 모두 들어간 형태로 ①과 다르게 ②는 익명 클래스 객체를 매번 생성하지 않는다. 위젯이 여러 개 존재하고, 위젯들 간의 연관성이 많은 경우 사용한다.

 

 

방법

View.OnClickListener Listener = new View.OnClickListener(){
    // 버튼 클릭 이벤트 리스너 객체 생성
    @Override
    public void onClick(View view)
    {
        switch (view.getId()) {
            case R.id.btn1:
                textView.setTextColor(Color.RED);
                textView.setText("Red");
                break;
            case R.id.btn2:
                textView.setTextColor(Color.BLUE);
                textView.setText("Blue");
                break;
            case R.id.btn3:
                textView.setTextColor(Color.GREEN);
                textView.setText("Green");
                break;
        }
    }
};

위젯의 id 속성값을 활용하여 Swich ~ case 문을 통해 위젯 별로 나눠서 작업을 처리한다.

먼저 해당 리스너 객체를 Listener 참조 객체 변수에 저장하고 위젯(위 코드에서는 버튼) 별로 setOnClickListener() 함수를 통해 리스너에 등록한다.

 

 

모든 코드

public class MainActivity extends AppCompatActivity {

    Button btnred;
    Button btnblue;
    Button btngreen;
    TextView textView;

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

        this.InitializeView();
        this.SetListener();
    }
    public void InitializeView()
            // InitializeView()를 사용해 각 뷰 위젯의 참조를 얻어옴.
    {
        btnred = (Button)findViewById(R.id.btn1);
        btnblue = (Button)findViewById(R.id.btn2);
        btngreen = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }
    public void SetListener()
            // 버튼에 클릭 리스너를 설정하는 메소드
    {
        View.OnClickListener Listener = new View.OnClickListener(){
            // 버튼 클릭 이벤트 리스너 객체 생성
            @Override
            public void onClick(View view)
            {
                switch (view.getId()) {
                    case R.id.btn1:
                        textView.setTextColor(Color.RED);
                        textView.setText("Red");
                        break;
                    case R.id.btn2:
                        textView.setTextColor(Color.BLUE);
                        textView.setText("Blue");
                        break;
                    case R.id.btn3:
                        textView.setTextColor(Color.GREEN);
                        textView.setText("Green");
                        break;
                }
            }
        };

        // 버튼에 클릭 이벤트 리스너를 설정
        btnred.setOnClickListener(Listener);
        btnblue.setOnClickListener(Listener);
        btngreen.setOnClickListener(Listener);
    }
}

 


클릭 이벤트를 사용하는 방법 3 Activity가 View.OnClickListener 인터페이스 상속 )

Activity가  View.OnClickListener 인터페이스를 상속 받아 onClick() 함수를 **오버라이딩 하는 방식

 

**오버라이딩

객체 지향 프로그래밍에서 하위 클래스가 상위 클래스로부터 상속받은 메소드를 재정의하는 것

 

방법

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

    this.InitializeView();
    this.SetListener();
}

public void SetListener()
{
    btnred.setOnClickListener(this);
    btnblue.setOnClickListener(this);
    btngreen.setOnClickListener(this);
}

Button의  setOnClickListener() 함수 호출할 때 this 키워드를 사용한다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
}

Activity 자신이  Button.OnClickListener을 **implements한다.

 

**implements

인터페이스를 구현하는 클래스를 선언할 때 사용한다.

 

 

전체 코드

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnred;
    Button btnblue;
    Button btngreen;
    TextView textView;

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

        this.InitializeView();
        this.SetListener();
    }
    public void InitializeView()
            // InitializeView()를 사용해 각 뷰 위젯의 참조를 얻어옴.
    {
        btnred = (Button)findViewById(R.id.btn1);
        btnblue = (Button)findViewById(R.id.btn2);
        btngreen = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }
    @Override
    public void onClick(View view)
    {
        switch (view.getId()) {
            case R.id.btn1:
                textView.setTextColor(Color.RED);
                textView.setText("Red");
                break;
            case R.id.btn2:
                textView.setTextColor(Color.BLUE);
                textView.setText("Blue");
                break;
            case R.id.btn3:
                textView.setTextColor(Color.GREEN);
                textView.setText("Green");
                break;
        }
    }
    public void SetListener()
    {
        btnred.setOnClickListener(this);
        btnblue.setOnClickListener(this);
        btngreen.setOnClickListener(this);
    }
}

익명 클래스 또는 별도의 이벤트 리스너를 만들고 싶지 않을 경우나 Activity 내부의 위젯에 대한 클릭 이벤트를 한 곳에서 처리하고 싶을 경우 또는 많은 수의 Activity 멤버를 액세스 해야 하는 경우 방법 을 사용한다.

 


클릭 이벤트를 사용하는 방법 4 위젯의 onClick 속성을 이용 )

xml 레이아웃 리소스와 자바소스를 혼합한 형태의 이벤트 처리 방식

 

방법

<Button
    android:id="@+id/btn1"
    android:onClick="onClick"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Red" />

<Button
    android:id="@+id/btn2"
    android:onClick="onClick"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Blue" />

<Button
    android:id="@+id/btn3"
    android:onClick="onClick"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Green" />

xml 레이아웃 리소스에서 각 위젯(코드에서는 버튼)에 onClick 속성값을 지정한다.

위 코드에서는 버튼에 onClick이라는속성값을 지정해준다.

public void onClick(View view)
{
    switch (view.getId()) {
        case R.id.btn1:
            textView.setTextColor(Color.RED);
            textView.setText("Red");
            break;
        case R.id.btn2:
            textView.setTextColor(Color.BLUE);
            textView.setText("Blue");
            break;
        case R.id.btn3:
            textView.setTextColor(Color.GREEN);
            textView.setText("Green");
            break;
    }
}

해당 값은 Activity의 멤버 함수로 등록이 된다.

Activity의 멤버 함수로 등록 = public void onClick(View view) {}로 구현

파랑색 형광펜이 그어진 onClick부분은 위젯에 지정된 속성값대로 써야한다. 만약 위젯에 속성값을 hellobtn으로 지정해줬다면 public void hellobtn(VIew view) {}라고 코드를 작성해야한다.

 

전체 코드

public class MainActivity extends AppCompatActivity {

    Button btnred;
    Button btnblue;
    Button btngreen;
    TextView textView;

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

        this.InitializeView();
    }
    public void InitializeView()
            // InitializeView()를 사용해 각 뷰 위젯의 참조를 얻어옴.
    {
        btnred = (Button)findViewById(R.id.btn1);
        btnblue = (Button)findViewById(R.id.btn2);
        btngreen = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }
    public void onClick(View view)
    {
        switch (view.getId()) {
            case R.id.btn1:
                textView.setTextColor(Color.RED);
                textView.setText("Red");
                break;
            case R.id.btn2:
                textView.setTextColor(Color.BLUE);
                textView.setText("Blue");
                break;
            case R.id.btn3:
                textView.setTextColor(Color.GREEN);
                textView.setText("Green");
                break;
        }
    }
}

 

 간단하게 이벤트 처리를 할 수 있다는 장점이 있지만, 코드의 양이 많아지고 복잡해지면 위젯과 핸들러의 관계 파악이 모호해진다는 단점이 있다.

  따라서 위젯이 적거나, 이벤트 리스너를 별도로 작성하는 것이 번거로운 경우나 간단하고 직관적인 클릭 이벤트를 적용하는 방법을 원하는 경우 사용할 수 있다.

 


예제 코드 출력화면

기본&nbsp;에뮬레이터

 

 

왼쪽 대로 순서대로 RED 버튼을 눌렀을 때, BLUE 버튼을 눌렀을 때, GREEN 버튼을 눌렀을 때 나타나는 에뮬레이터의 화면이다. 위에 나온 클릭 이벤트를 사용하는 4가지 방법을 모두 사용해보아도 코드는 다르지만 결과는 모두 같다.

'프로그래밍 코드 > Android Studio' 카테고리의 다른 글

#2. AI smart home  (0) 2024.03.13
#1. AI smart home  (0) 2024.03.13
[Android Studio] 뷰 바인딩(View Binding)  (0) 2023.05.17
[Android Studio] 레이아웃  (0) 2023.05.16
[Android Studio] 채팅 어플리케이션  (0) 2023.05.15