クリック処理(OnClickListenerインターフェースの実装)

広告

ボタンに対するクリック処理について今度は「OnClickListener」インタフェースを実装する方法を確認します。

別のクラスを用意する方法もありますが、今回は自分自身のクラスに「OnClickListener」インタフェースを実装してみます。

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View.OnClickListener;

public class Test extends Activity implements OnClickListener{
    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

    }
}

実装が必要な「onClick」メソッドを定義します。

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View.OnClickListener;

public class Test extends Activity implements OnClickListener{
    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

    }

    public void onClick(View v) {
        /* .... */
    }
}

「setOnClickListener」メソッドを使って対象となるボタンがイベントを受け取れるように設定します。この時「setOnClickListener」の引数には「OnClickListener」インターフェースを実装したクラスのオブジェクトを指定しますが、自分自身のクラスで「OnClickListener」インターフェースを実装していますので「this」を指定します。

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View.OnClickListener;

public class Test extends Activity implements OnClickListener{
    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Button button = new Button(this);
        button.setOnClickListener(this);
    }

    public void onClick(View v) {
        /* .... */
    }
}

匿名クラスの場合と異なる、イベント発生時の処理を行う「onClick」メソッドを分離しています。各イベント発生元のビューから同じメソッドが呼ばれますので「onClick」メソッド内でどのビューから呼ばれたのかを判別して処理を行います。

サンプルプログラム

それでは実際に試してみます。プロジェクトを作成しソースコードを次のように変更しました。

Test04_01.java

package jp.javadrive.android;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View.OnClickListener;

public class Test04_01 extends Activity implements OnClickListener{
    private final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
    private int count1;
    private int count2;
    private Button button1;
    private Button button2;

    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        count1 = 0;
        count2 = 0;

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);
        setContentView(linearLayout);

        button1 = new Button(this);
        button1.setText("Count");
        button1.setOnClickListener(this);
        linearLayout.addView(button1, 
          new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));

        button2 = new Button(this);
        button2.setText("Count");
        button2.setOnClickListener(this);
        linearLayout.addView(button2, 
          new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
    }

    public void onClick(View v) {
        if (v == button1){
            count1++;
            button1.setText("Count:" + count1);
        }else if (v == button2){
            count2++;
            button2.setText("Count:" + count2);
        }
    }
}

ビルド後にエミュレーター上で実行します。

OnClickListenerインターフェースの実装

ボタンをクリックするとボタン毎にカウントを行って表示される文字列を書き換えます。どのボタンから呼ばれたのかは「onClick」メソッドに渡されてきた引数と各ボタンのオブジェクトを比較しています。

OnClickListenerインターフェースの実装

OnClickListenerインターフェースの実装

( Written by Tatsuo Ikura )