본문 바로가기

Programming/Android강의

안드로이드 강의07- Android:OnClick를 구현하는 4가지 방법


Android OnClick


오늘은 OnClick 메서드에 대해서 알아보겠습니다. 

OnClick메서드는 OnClickListener interface에 정의되어 있는 메서드입니다.


리스너는 말그대로 듣고 있는 녀석입니다. 리스너 내의 메서드를 구현해 놓으면 특정 이벤트를 계속 듣고 있다가 이벤트가 발생하는 시점에 메서드를 호출해 줍니다.


오늘은 그중에 View에 있는 OnClickListener을 알아보겠습니다.

OnClickListener에 있는 OnClick메서드를 구현하는 4가지 방법을 알아보겠습니다.


방법4가지


1. OnClickListener interface를 implements 하여 메서드를 구현

2. View의 인자에 바로 Listener을 구현 

3. clickListener을 별도의 객체로 생성하여 set하는 방법

4. xml에서 메서드를 선언하고 구현하는 방법


위의 방법들로 안드로이드 OnClick 메서드를 구현할 수 있으며 4번은 그의 사용하지 않습니다. 보통 뷰와 기능은 분리해서 작성하는게 일반적인데 xml은 뷰의 영역에 기능이 들어가게 됨으로써 서로 의존하게 되기 때문입니다.

하지만 우리는 공부를 해야 하니깐 구현은 해보도록 하겠습니다.


1번부터 하나씩 구현하면서 언제 사용해야 하는 방법인지를 알아보도록 하겠습니다.

코드는 지난 6강의 코드를 이용해서 OnClick부분만 변경하도록 할께요


6강바로가기(새창)


1.View.OnClickListener을 implements하여 OnClick메서드를 구현

자바의 기본은 아실꺼라고 생각합니다. 아래의 코드는 interface를 구현하였습니다.

그리고 구현한 리스너를 등록해주었습니다.

이러한 방법은 주로 이벤트 리너스를 많이 작성해야 하는 상황에서 사용하시면 됩니다. 제가 가장 좋아하는 방법입니다. 

package test.com.exam;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn1;
    private Button btn2;

    private View view1;
    private View view2;

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

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);

        view1 = findViewById(R.id.view1);
        view2 = findViewById(R.id.view2);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.btn1 :
                view1.setVisibility(View.VISIBLE);
                view2.setVisibility(View.GONE);
                break;
            case R.id.btn2 :
                view1.setVisibility(View.GONE);
                view2.setVisibility(View.VISIBLE);
                break;
        }
    }
}


2.다음은 View의 인자에 리스너를 바로 구현하는 방식입니다.

1번의 방법과 같이 가장많이 사용되는 방식입니다. 이러한 방식이 생소할수도 있지만 안드로이드에서 많이 사용하는 기법이니 꼭 알아두시길 바랍니다.

이 방법은 구현 이벤트의 수가 적을 경우 그리고 리스너를 재사용하지 않을경우 많이 사용하게 됩니다.

package test.com.exam;

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

public class MainActivity extends AppCompatActivity{

    private Button btn1;
    private Button btn2;

    private View view1;
    private View view2;

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

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);

        view1 = findViewById(R.id.view1);
        view2 = findViewById(R.id.view2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                view1.setVisibility(View.VISIBLE);
                view2.setVisibility(View.GONE);
                
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                view1.setVisibility(View.GONE);
                view2.setVisibility(View.VISIBLE);
            }
        });
    }
}


3.리스너를 객체로 선언해두고 set하는 방법입니다. 

이 방식은 리스너를 재사용해야 되는 상황에서 많이 사용하는 기법입니다. 안드로이드에서 리스너를 재사용하는 경우는 잘 없긴 하지만 없진 않으니 이 방식도 알고 계시면 유용하게 사용하실 수 있습니다.


package test.com.exam;

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

public class MainActivity extends AppCompatActivity{

    private Button btn1;
    private Button btn2;

    private View view1;
    private View view2;

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

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);

        view1 = findViewById(R.id.view1);
        view2 = findViewById(R.id.view2);

        btn1.setOnClickListener(btn1Listener);
        btn2.setOnClickListener(btn2Listener);
    }

    View.OnClickListener btn1Listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view1.setVisibility(View.VISIBLE);
            view2.setVisibility(View.GONE);
        }
    };

    View.OnClickListener btn2Listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            view1.setVisibility(View.GONE);
            view2.setVisibility(View.VISIBLE);
        }
    };


4. 그의 사용하지 않는 방식입니다.

위의 코드와 다른 부분은 xml에 onClick:"onClick1" 이라는 코드가 들어갔습니다

여기에 들어가는 onClick1이 바로 java소스단에 작성할 메서드 명이 됩니다.


        <Button
            android:id="@+id/btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClick1"
            android:text="프레임1"
            />
        <Button
            android:id="@+id/btn2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="onClick2"
            android:text="프레임2"

            />


자바단을 보면 이경우 특이한 점은 버튼을 객체로 생성하여 리스너를 등록하는 과정없이 바로 메서드가 호출된다는 점입니다. 

저는 처음에 코드가 간결하여 이방식을 썼었지만 기능을 작성하는 코드와 뷰를 담당하는 레이아웃간의 의존성이 강해지기 때문에 잘 사용하지 않게 되었습니다.

package test.com.exam;

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

public class MainActivity extends AppCompatActivity{

    private View view1;
    private View view2;

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

        view1 = findViewById(R.id.view1);
        view2 = findViewById(R.id.view2);

    }

    public void onClick1(View v) {
        view1.setVisibility(View.VISIBLE);
        view2.setVisibility(View.GONE);

    }

    public void onClick2(View v) {
        view1.setVisibility(View.GONE);
        view2.setVisibility(View.VISIBLE);

    }
}



이상으로 안드로이드 OnClickListener를 구현하는 4가지 방법에 대해서 알아보았습니다.

중요한 부분이니깐 꼭 집고 넘어가시길 바랄께요~