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的
- 「すべてのボタンが押されたとき動作する機能」の実装が簡単
デメリット
- ネストが多くなりがち
まとめ
性能にはあまり差はないとは思いますが、ソースの見易さに差が出てくるので、
適した方法で実装するといいと思います。