6月 01 2010

androidのOnClickListenerについてのメモ。

Category: android,javasimultechnology @ 2:43 AM

ボタンがclickされた時の動きをまとめておきたいと思った。

eclipseは以下の構成。

表示ボタンを押したら文字が表示され、非表示ボタンを押すと消えるというようなシンプルなもの。

レイアウトを定義するmain.xmlで、ボタンや文字列を表示するラベルを定義する。
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="ButtonTest"
    />
<Button android:id="@+id/visible"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=" visible "
    />
<Button android:id="@+id/invisible"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="invisible"
    />
<TextView
    android:id="@+id/test_label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

この時点で実行すると以下のように表示される。

ボタンが押された時に何かアクションを起こすには、ボタンにsetOnClickListenerを追加する。
setOnClickListenerの引数はView.OnClickListener型。View.OnClickListenerはinterfaceで、定義されているのはonClick(View v)メソッド。
リファレンスは以下など(ローカルでも見れる)。
http://bit.ly/amRFde

このinterfaceを実装したクラスを作って、引数に渡すには以下の二つの方法がある。

1. 自分自身のクラス(Activityを継承している今触っているクラス)をView.OnClickListenerをimplementsして、引数に自分自身(this)を渡す。

2. 引数に匿名関数を渡す。

まずは1の自分自身のクラスにView.OnClickListenerインターフェースを実装させる。
ButtonTest.java

package button.test;

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

public class ButtonTest extends Activity implements OnClickListener {

	private Button visibleButton;
	private Button invisibleButton;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        visibleButton = (Button)findViewById(R.id.visible);
        visibleButton.setOnClickListener(this);

        invisibleButton = (Button)findViewById(R.id.invisible);
        invisibleButton.setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		// TODO 自動生成されたメソッド・スタブ
		TextView tv = (TextView) findViewById(R.id.test_label);

		if (v == visibleButton) {
			tv.setText("Hello");
		}
		else if (v == invisibleButton) {
			tv.setText("");
		}
	}
}

次は無名クラスを使うバージョン。動作は上と全く同じ。
ButtonTest.java

package button.test;

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

public class ButtonTest extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 表示させる文字列の取得
        // finalにしないと無名クラス内から参照できない
        // もしくはクラスのインスタンス変数(フィールド)にする。
        final TextView tv = (TextView) findViewById(R.id.test_label);

        Button visibleButton = (Button)findViewById(R.id.visible);
        // 表示ボタンが押された時の処理
        visibleButton.setOnClickListener(new Button.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO 自動生成されたメソッド・スタブ
			tv.setText("Hello");
			}
        });

        // 非表示ボタンが押された時の処理
        Button invisibleButton = (Button)findViewById(R.id.invisible);
        invisibleButton.setOnClickListener(new Button.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO 自動生成されたメソッド・スタブ
			tv.setText("");
			}
        });
    }
}

表示ボタンを押すと文字が表示され、非表示ボタンを押した場合は消える。

ところで、今、BSで94年W杯の「ブラジル×イタリア」がやってるけど、この頃になると古さはあまり感じないねぇ。いやそれにしても、バッジョ、アルベルティーニ、バレージなどイタリアは錚々たる顔ぶれだ。。


2 Responses to “androidのOnClickListenerについてのメモ。”

  1. buzz says:

    はじめまして、何度か寄らせていただいています。
    質問があるのですが、場違いではないでしょうか。
    もし可能なら教えてください。

    最後のソース23行目
    visibleButton.setOnClickListener(new Button.OnClickListener() {

    なのですが、OnClickListenerインターフェースの前についているButtonというのは
    パッケージ名でしょうか、ここにButtonがついている理由がわからず、
    たとえば、View.OnClickListenerでは駄目な理由はなんでしょうか。
    パッケージ名だとすれば
    import android.view.View.OnClickListener とすることでも解決できますか?
    あまりこういう記法になれておらず、おかしな質問で申し訳ありません。

  2. simultechnology says:

    お返事おそくなってすみません。

    まずButtonはandroid.widget.Buttonクラスになりまして、android.view.Viewクラスを継承しています。

    OnClickListenerインターフェースはViewクラス内にネストされています。クラス内にネストしたインターフェースは常にstaticなのですが、慣習的にインターフェース宣言にstaticは表示しないようです。

    Buttonの親クラスであるViewクラス内のstaticなOnClickListenerインターフェースを呼出すために、Button.OnClickListenerという書き方になります。この型の匿名クラスを生成するために、new Button.OnClickListener() という表記方法になります。

    new と staticな呼出しが一カ所にまとまっているので分かりづらいですよね。ただ、多くのサンプルはこのような書き方になっているので、自分はこう書くものだと覚えるようにしています。

    またButtonはViewを継承しているので、

    visibleButton.setOnClickListener(new View.OnClickListener() {

    という書き方でも大丈夫です。

    import android.view.View.OnClickListenerとした場合は、OnClickListenerインターフェースをimportしているので、

    visibleButton.setOnClickListener(new OnClickListener() {

    という書き方でも大丈夫になります。
    ただ、この場合、何のクラスのOnClickListenerインターフェースか分からないので、クラス名.インターフェースと書く事が多いのかなと思っています。

Leave a Reply