ボタン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のイベントとリスナについて解説していきます。
