2011年3月2日水曜日

「Android 処理」:ボタンなどのクリックイベントを定義する

1.可能であれば、クリックリスナーのインタフェース(android.view.View.OnClickListener)を実装するのが一番ベストだと思います。
public class SampleClickEvent extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // ボタンのオンクリックリスナーを指定する
        findViewById(R.id.button).setOnClickListener(this);
    }

    /**
     * オンクリックリスナーの実装
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        // ボタンIDごとに処理を実装する
        case R.id.button:
            // 処理
        }
    }
}

2.それでは、他の実装方法を見てみましょう。
①匿名クラスを使用する方法:
public class SampleClickEvent extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // ボタンのオンクリックリスナーを指定する
        findViewById(R.id.button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 処理
            }
        });
    }
}
この方法のメリットはボタンごとにクリックリスナーを定義することで、onClick()メソッドにはボタンIDによって処理を分けるとこをしなくてもよい。
デメリットとしては、ボタンが多いとき、onClick()メソッドの宣言も多いし、処理はばらばらに離れるとメンテナンスは難しくなると考えられます。

②xmlレイアウトで宣言、Activityで実装する方法:
res/layout/main.xmlファイル:

    
この宣言 → android:onClick="onClickButton" を覚えてください

Activityファイル:
public class SampleClickEvent extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void onClickButton(View v) {
        switch (v.getId()) {
        // ボタンIDごとに処理を実装する
        case R.id.button:
            // 処理
        }
    }
}
この方法のメリットはソースをだいぶ削減できるし、良い方法でも考えられるが、最大のデメリットはxmlで宣言したオンクリックリスナー(この例では:onClickButton)の名前はActivityに定義されているメソッドと違っても、ビルドエラーが表示されてくれません。実行するときはもちろん落ちてしまいます。
ATD Plugin for Eclipseはこの問題を解決すれば、この方法も悪くないと思います。