ボタンがclickされた時の動きをまとめておきたいと思った。
表示ボタンを押したら文字が表示され、非表示ボタンを押すと消えるというようなシンプルなもの。
レイアウトを定義する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杯の「ブラジル×イタリア」がやってるけど、この頃になると古さはあまり感じないねぇ。いやそれにしても、バッジョ、アルベルティーニ、バレージなどイタリアは錚々たる顔ぶれだ。。



6月 3rd, 2010 12:26 PM
はじめまして、何度か寄らせていただいています。
質問があるのですが、場違いではないでしょうか。
もし可能なら教えてください。
最後のソース23行目
visibleButton.setOnClickListener(new Button.OnClickListener() {
なのですが、OnClickListenerインターフェースの前についているButtonというのは
パッケージ名でしょうか、ここにButtonがついている理由がわからず、
たとえば、View.OnClickListenerでは駄目な理由はなんでしょうか。
パッケージ名だとすれば
import android.view.View.OnClickListener とすることでも解決できますか?
あまりこういう記法になれておらず、おかしな質問で申し訳ありません。
6月 5th, 2010 5:28 AM
お返事おそくなってすみません。
まず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インターフェースか分からないので、クラス名.インターフェースと書く事が多いのかなと思っています。