ボタン2個の処理
それでは、ボタンが複数存在する場合の処理について説明していきましょう。
まずは、上記サンプルにボタンをひとつ追加します。strings.xmlファイルの<string name="bt_click">タグの直下、および、activity_hello_sample.xmlファイルの<Button>タグと<TextView>タグの間に以下のソースコードを追記してください。
<?xml version="1.0" encoding="utf-8"?> <resources> ~省略~ <string name="bt_clear">クリア</string> </resources>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ~省略~ android:text="@string/bt_click"/> <Button android:id="@+id/btClear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_clear"/> <TextView ~省略~ </LinearLayout>
この状態で、アプリを起動しなおしてみてください。以下のように「クリア」ボタンが追加された画面になっています。
このクリアボタンをタップすると、EditTextに入力した文字列、およびTextViewに表示された文字列がクリアされるように処理を記述しますが、上述の手順に則って、リスナを新規に作成しても構いません。しかし、ここでは同一リスナクラスを使用し、onClick()メソッド内でどのボタンをタップしたかを判定し、それに応じて処理を分岐させる方法を取ります。
まず、「クリア」ボタンにリスナを設定します。onCreate()メソッド内に以下のソースコードを追記してください。
public class HelloSampleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { ~省略~ Button btClear = (Button) findViewById(R.id.btClear); btClear.setOnClickListener(listener); } ~省略~ }
このように、ボタンオブジェクトbtClickに設定した同じリスナオブジェクトlistenerを設定します。
次に、リスナクラス内のonClick()メソッドを以下のように書き換えます。
public class HelloSampleActivity extends AppCompatActivity { ~省略~ @Override public void onClick(View view) { EditText input = (EditText) findViewById(R.id.etName); // (10) TextView output = (TextView) findViewById(R.id.tvOutput); // (10) int id = view.getId(); // (11) switch(id) { case R.id.btClick: String inputStr = input.getText().toString(); output.setText(inputStr + "さん、こんにちは!"); break; case R.id.btClear: input.setText(""); output.setText(""); break; } } } }
onClick()メソッドの引数viewはタップされた画面部品を表します。(11)のように、このviewのメソッドgetId()を使えば、その画面部品のR値を取得できます。このR値がどのボタンを表すか、switch文を使えば簡単に分岐できます。この方式の利点は(10)のように、各ボタンで共通の処理がある場合にソースコードの重複を防ぐことができることです。
ソースコードの追記が終了したら、アプリを起動しなおし、クリアボタンが動作するか確認してください。
まとめ
今回は、Androidアプリでのアクティビティへの記述方法、特に、イベントとリスナについて解説してきました。次回はこの続きとして、ListViewのイベントとリスナについて解説していきます。