[안드로이드 스튜디오] 이벤트 처리 방법 - 리스너 구현 및 이벤트 핸들링

2020. 12. 21. 21:09개발 관련/안드로이드 스튜디오

이벤트 처리 방법

  1. 익명 클래스 생성
  2. 익명 클래스로 참조 객체 생성
  3. Activity가 리스너 인터페이스 상속
  4. View에 onClick 속성값 지정(xml)

 


이벤트 핸들링이란?

 

사용자의 특정한 행동에 대해 특정한 기능을 수행하도록 처리하는 것

 

안드로이드에서는 특정 이벤트 처리를 리스너를 구현함으로써 처리할 수 있다.

 

Button이 클릭되면 TextView의 Text 컬러 색상을 변경하는 예제를 예시로 들어보자.

 

레이아웃 리소스 xml

   <LinearLayout
        android:id="@+id/Verti_layout"
        android:layout_width="368dp"
        android:layout_height="495dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"
            android:textSize="30sp"
            tools:layout_editor_absoluteX="110dp"
            tools:layout_editor_absoluteY="85dp" />

        <LinearLayout
            android:id="@+id/hori_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            tools:layout_editor_absoluteX="8dp"
            tools:layout_editor_absoluteY="8dp">

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

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

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

 

컴포넌트 트리


 

1. 익명 클래스( Anonymous Class ) 생성

리스너를 등록할 때 이벤트 처리구문을 오버라이딩 하는 방식   

View 위젯간의 연관성이 적을 때 사용한다.

 

 - 가독성이 떨어진다.

 

MainActivity.java

package com.example.myapplication;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button btn_red;
    Button btn_blue;
    Button btn_green;
    TextView textView;

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

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

    public void InitializeView()
    {
        btn_red = (Button)findViewById(R.id.btn1);
        btn_blue = (Button)findViewById(R.id.btn2);
        btn_green = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }
    public void SetListener()
    {
        btn_red.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {
                textView.setTextColor(Color.RED);
            }
        });

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

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

 

2. 익명 클래스( Anonymous Class )로 참조 객체 생성

리스너에 메모리를 할당할 때 이벤트 처리구문을 오버라이딩 하는 방식 - 예제와 가장 어울린다.

 

 

MainActivity.java

package com.example.myapplication;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button btn_red;
    Button btn_blue;
    Button btn_green;
    TextView textView;

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

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

    public void InitializeView()
    {
        btn_red = (Button)findViewById(R.id.btn1);
        btn_blue = (Button)findViewById(R.id.btn2);
        btn_green = (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);
                        break;
                    case R.id.btn2:
                        textView.setTextColor(Color.BLUE);
                        break;
                    case R.id.btn3:
                        textView.setTextColor(Color.GREEN);
                        break;
                }
            }
        };

        btn_red.setOnClickListener(Listener);
        btn_blue.setOnClickListener(Listener);
        btn_green.setOnClickListener(Listener);
    }
}

 

3. Activity가 View.OnClickListener 인터페이스 상속

Activity가 리스너 인터페이스를 상속받는 방식

onClick함수를 Activity안에서 오버라이딩한다( this로 등록한다 )

해당되는 view는 activity에 강하게 종속되게 된다.

 

MainActivity.java

package com.example.myapplication;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btn_red;
    Button btn_blue;
    Button btn_green;
    TextView textView;

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

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

    public void InitializeView()
    {
        btn_red = (Button)findViewById(R.id.btn1);
        btn_blue = (Button)findViewById(R.id.btn2);
        btn_green = (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);
                break;
            case R.id.btn2:
                textView.setTextColor(Color.BLUE);
                break;
            case R.id.btn3:
                textView.setTextColor(Color.GREEN);
                break;
        }
    }

    public void SetListener()
    {
        btn_red.setOnClickListener(this);
        btn_blue.setOnClickListener(this);
        btn_green.setOnClickListener(this);
    }
}

 

4. Button View의 onClick 속성값 지정

 

xml 레이아웃 리소스와 java 소스 모두 사용하는 이벤트 방식

xml 파일 - Button에 onClick하면 호출 될 메소드(java 파일 내, 이곳에서는 MyOnClick)의 명칭을 입력한다.

<Button
    ...
    android:onClick="MyOnClick"
    android:text="Red" />

<Button
    ...
    android:onClick="MyOnClick"
    android:text="Blue" />

<Button
    ...
    android:onClick="MyOnClick"
    android:text="Green" />

MainActivity.java

package com.example.myapplication;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{

    Button btn_red;
    Button btn_blue;
    Button btn_green;
    TextView textView;

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

        this.InitializeView();
    }

    public void InitializeView()
    {
        btn_red = (Button)findViewById(R.id.btn1);
        btn_blue = (Button)findViewById(R.id.btn2);
        btn_green = (Button)findViewById(R.id.btn3);
        textView = (TextView)findViewById(R.id.textView);
    }

    public void MyOnClick(View view)
    {
        switch (view.getId()) {
            case R.id.btn1:
                textView.setTextColor(Color.RED);
                break;
            case R.id.btn2:
                textView.setTextColor(Color.BLUE);
                break;
            case R.id.btn3:
                textView.setTextColor(Color.GREEN);
                break;
        }
    }
}

그동안 3번을 주로 사용하고 있었는데, 인터페이스를 상속받다보니 오버헤딩이 많이발생하게 되는건가?라는 의문이들어 방식을 찾아보게 되었다. 

간단하다면 2번이 상속받는 것이 아니라 객체 생성이기 때문에 성능면에서 훨씬 나아보인다. -> 뇌피셜임


참조 : lktprogrammer.tistory.com/140

 

[Android] 안드로이드 - 버튼 이벤트 처리방법 정리 (리스너 구현 및 이벤트 핸들링)

App 사용자의 일련의 행동에 대해 반응하고 특정한 기능을 수행하는 것을 이벤트를 처리한다는 또는 이벤트를 핸들링한다고 말합니다. 대표적으로 Button 클릭 이벤트가 있습니다. 사용자가 Button

lktprogrammer.tistory.com