Button#onClickの実装方法

書き方は人それぞれ

人それぞれによって実装方法は異なると思います。
今回はボタンをひとつ設置し、それを押されたときにトーストを表示するという機能を実装したいと思います。

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">
<Button
  android:id="@+id/btnOK"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="OK" />
</LinearLayout>

実装方法の考えられるパターンは3つ

  • 無名クラス
  • 有名クラス
  • Activityに実装

それぞれ見てみましょう。

無名クラス

ソース
public class MainActivity extends Activity {

  private Button btnOK;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnOK = (Button)findViewById(R.id.btnOK);
    btnOK.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Hello!", Toast.LENGTH_LONG).show();
      }
    });
  }
}

参考書やウェブサイトなんかでも一番使われている方法ではないでしょうか

メリット
  • ボタンへの機能を個別に書くことができる
デメリット
  • ネストが多くなりがち
  • Contextを取得したいときに、いちいちMainActivity.thisと書かなければならない

有名クラス

ソース
public class MainActivity extends Activity {

  private Button btnOK;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnOK = (Button) findViewById(R.id.btnOK);
    btnOK.setOnClickListener(new BtnOKOnClick(this));
  }
}

class BtnOKOnClick implements OnClickListener {
  private Context mContext;

  public BtnOKOnClick(Context context) {
    mContext = context;
  }

  @Override
  public void onClick(View v) {
    Toast.makeText(mContext, "Hello!", Toast.LENGTH_LONG).show();
  }
}

あまり見たことないパターンですね。
今までこのソースを書いている人は見たことないです。

メリット
  • ネストが多くならない
  • ボタンの機能を個別に書くことができる
デメリット
  • クラスが増える
  • ボタン押下からActivityの表示をいじりたいとき厄介

Activityに実装

ソース
public class MainActivity extends Activity implements OnClickListener {

  private Button btnOK;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

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

  @Override
  public void onClick(View v) {
    switch (R.id.btnOK) {
    case R.id.btnOK:
      Toast.makeText(this, "Hello!", Toast.LENGTH_LONG).show();
      break;
    }
  }
}

参考書で一回だけ見ました。
なかなかスマートなので、私はこれで書いてます。

メリット
  • 書き方がjava
  • 「すべてのボタンが押されたとき動作する機能」の実装が簡単
デメリット
  • ネストが多くなりがち

まとめ

性能にはあまり差はないとは思いますが、ソースの見易さに差が出てくるので、
適した方法で実装するといいと思います。