ボタンのイベント処理
文字列の変更はできました。今度はこれを少し変更して、ボタンをクリックしたときに何らかの処理を行い、その結果を表示する、というサンプルにしてみましょう。
クリックリスナー
ボタンのクリックイベントを検知するには、ボタンのオブジェクトにリスナーを登録します。リスナーとは、イベントに応じて呼び出されるメソッドが定義されたオブジェクトです。前回説明したサンプルで言えば、Activityクラスがリスナーといえます。あらかじめonCreateメソッドなど、特定のイベントが発生したら呼ばれるメソッドが定義されているのです。
onCreateメソッドなどは、必ず発生するイベントの処理ですが、ボタンのイベントはアプリケーションによります。必ずあるものではないため、そのイベントに対応するメソッドをすべて定義しておくのは無駄があります。
そこでイベントごとに、呼ばれるメソッドだけを定義したクラス(インターフェイス)を用意しておき、必要に応じてそれを実装する、という方法をとります。
インターフェイスとは、定数と抽象メソッドだけがメンバーとなる特殊なクラスです。インターフェイスは、クラスの継承のように記述しますが、実装と呼びます。
class クラス名 implements インタフェース名 { フィールド定義 メソッド、抽象メソッドの定義 }
ボタンのクリックイベントに対応するリスナーは、android.view.View.OnClickListenerというインターフェイスです。OnClickListenerは、Viewクラス内で定義されていて、onClickというメソッドのみ定義されています。
つまりこのOnClickListenerインターフェイスを実装したクラスを、クリックイベントのリスナーとして登録すれば、ボタンがクリックされたときに、onClickメソッドが呼び出されるという具合になります。
修正したサンプルソースは、次のようになります。
package codezine.androidjava.chap1; 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 HelloAndroid extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // ボタンオブジェクトの取得 Button bt = (Button)findViewById(R.id.button1); // クリックリスナーの登録 bt.setOnClickListener(this); } // ボタンクリック時に呼ばれるメソッド public void onClick(View view) { TextView tview = (TextView)findViewById(R.id.textView1); tview.setText("ボタンが押されました"); } }
ViewクラスにsetOnClickListenerメソッドが用意されています。ここでは、ボタンオブジェクトのsetOnClickListenerメソッドに、OnClickListenerインターフェイスを実装したHelloAndroidクラスを指定しています。
したがって、HelloAndroidクラスで実装したonClickメソッドが、ボタンのクリック時に呼び出される、というわけです。
無名クラス
さきほどのサンプルでは、OnClickListenerインターフェイスを、HelloAndroidクラス自体で実装していますが、これを無名クラスで記述することもできます。
無名クラスとは、クラス内でクラスを宣言する内部クラスの一種で、その名のとおりクラス名がないクラスです。無名クラスは、このようなインタフェースを実装する際によく使用されます。
また無名クラスは、次のように、クラスの宣言と同時にオブジェクトの生成まで記述します。
new インタフェース名() { 抽象メソッドの実装 }
さきほどのサンプルコードを無名クラスで書き直すと、onCreateメソッドの部分は次のようになります。
public class HelloAndroid extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // ボタンオブジェクトの取得 Button bt = (Button) findViewById(R.id.button1); // クリックリスナーの登録 bt.setOnClickListener(new OnClickListener() { public void onClick(View view) { TextView tview = (TextView)findViewById(R.id.textView1); tview.setText("ボタンが押されました"); } }); } }
無名クラスは、場合によっては読みにくいソースになってしまいますが、よく使われる形ですので、この形も押さえておきましょう。