안드로이드 스튜디오 예제 3 – 이벤트 처리 4가지 방법

예제 1에서 버튼을 클릭했을 때의 이벤트를 처리하는 방법을 살펴보았다. 이벤트 리스너(event listener)를 이용한 방식이었는데, 이 외에도 다양한 방식으로 이벤트 처리를 할 수 있다. 본 예제에서는 예제 1에서와 동일한 방식을 포함해서 총 4가지 종류의 이벤트 처리 방법에 대해서 살표볼 것이다.

——————————————————————————————————–

안드로이드 스튜디오를 실행한다.

“Start a new Android Studio project”를 선택한다.eventHandling01

“Application name”에 “EventHandlingApplication”을 입력하고 Next 버튼을 클릭한다.eventHandling02

“Phone and Table”, “Minimum SDK = API 22″를 선택하고 Next 버튼을 클릭한다.eventHandling03

“Blank Activity”를 선택하고 Next 버튼을 클릭한다.eventHandling04
“Activity Name”에 “EventHandlingActivity”를 입력하고 Finish 버튼을 클릭한다.eventHandling05

그리고, 다음과 같은 모습의 안드로이드 스튜디오를 볼 수 있다.
(content_event_handling.xml이 선택된 상태)eventHandling06

“Hello world!”가 적혀있는 TextView를 선택한 후 Delete키를 눌러서 삭제한다.

“Large Text”를 드래그하여 최상단 중앙에 위치시키고, 더블클릭하여 text에는 blank, id에는 textView1을 입력한다.eventHandling08

버튼 왼쪽에 나타난 전구 아이콘을 클릭하여 나타난 [I18N]을 클릭한다.eventHandling09

“Resource name”에 “textView1_string”을 적고 OK 버튼을 클릭한다.eventHandling10

“Rendering Problems” 메시지가 나오면, Refresh버튼을 클릭한다.eventHandling11

그러면, 다음과 같은 화면을 볼 수 있다.eventHandling07

비슷한 방법으로 아래쪽에 4개의 버튼들을 드래그하여 중앙에 배치한다. 각 버튼을 더블클릭하여 text에는 Button1, Button2, Button3, Button4를, id에는 button1, button2, button3, button4를 각각 입력해준다. 그리고, 각 버튼 왼쪽의 전구 아이콘을 클릭하여 나타난 [I18N]을 선택하여 button1_string, button2_string, button3_string, button4_string을 각각 입력해준다.eventHandling13

Button4를 선택한 후, Properties의 onClick 항목에 MyOnClick을 입력한다.eventHandling15

TestActivity.java를 선택하고, 다음과 같이 코드를 수정한다.

package com.example.administrator.eventhandlingapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Button;

public class EventHandlingActivity extends AppCompatActivity implements View.OnClickListener {

    TextView mTextView1;
    Button mButton1;
    Button mButton2;
    Button mButton3;
    Button mButton4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_handling);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();
            }
        });

        mTextView1 = (TextView)findViewById( R.id.textView1 );
        mButton1 = (Button)findViewById( R.id.button1 );
        mButton2 = (Button)findViewById( R.id.button2 );
        mButton3 = (Button)findViewById( R.id.button3 );
        mButton4 = (Button)findViewById( R.id.button4 );

        mButton1.setOnClickListener(
            new View.OnClickListener() {
                public void onClick( View v ) {
                    mTextView1.setText( "From Button1");
                }
            }
        );

        mButton2.setOnClickListener( this );

        mButton3.setOnClickListener( MyOwnListener );
    }

    public void onClick( View v ) {
        mTextView1.setText( "From Button2" );
    }

    Button.OnClickListener MyOwnListener = new View.OnClickListener() {
        public void onClick( View v ) {
            mTextView1.setText( "From Button3" );
        }
    };

    public void MyOnClick( View v ) {
        mTextView1.setText( "From Button4" );
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_event_handling, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Shift+F10를 눌러서 “Device Chooser”를 띄우고, Button1, Button2, Button3, Button4를 클릭하면 각각 “From Button1”, “From Button2”, “From Button3”, “From Button4″가 출력되는 것을 확인할 수 있다.eventHandlingResult

이상 이벤트를 처리하는 대표적인 4가지 방법에 대한 예제를 작성해보았다.

첫 번째 방법은 OnClickListener를 새로 생성하여 해당 뷰 객체(여기서는 Button1)의 이벤트 리스너로 등록해주는 방식이다.  가장 기본적으로 사용되는 이벤트 처리 방식이다.

두 번째 방법은 OnClickListener implement하여 구현하는 방법이다. 이 방법을 사용하기 위해서는 반드시 위의 소스코드에서처럼 implements View.OnClickListener부분이 추가되어야 한다. OnClickListener의 인자로 현재 액티비티(this)를 넘겨주고 OnClick(View v) 함수를 따로 구현해주면 된다. 첫 번째 방법에 비해 코드가 깔끔해서 많이 사용되는 방식이다.

세 번째 방법은 리스너를 객체로 선언(여기서는 MyOwnListener)하여 set하는 방식이다. 이 역시 많이 사용되는 방식이다.

네 번째 방법은 이벤트 리스너(event listener)를 사용하지 않고 XML의 onClick 속성을 이용하는 방법이다. 가장 간단한 방법이기는 하지만 다른 방법들에 비해 기능상의 제약이 있다. Java 소스코드에 XML의 onClick에 입력한 이름의 함수를 작성(이 예제에서는 MyOnClick 함수)하면 해당 버튼 클릭시 이 함수가 호출된다.

4가지 방법 모두 대상 뷰가 어떤 것인지를 전달 받기위해 onClick 함수의 입력 인자로 View v를 받는다.

답글 남기기