Androidアプリ入門 No.13 ButtonのActivityからの操作
今風に書き直した記事がありますので、合わせて参照ください。
blog.webarata3.link
Button
Activityからの操作
Buttonは表示するだけではあまり意味がない。EditViewのサンプルを変更し、ボタンを押した際にボタンに応じデザインを変更する例を以下に示す。
まずは、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" android:background="#ffffff" > <EditText android:id="@+id/editText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="何か入力" android:textSize="16sp" /> <Button android:id="@+id/buttonRed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="赤" /> <Button android:id="@+id/buttonGreen" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="緑" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000" android:textSize="16sp" android:text="結果テキスト:" android:textStyle="normal" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView" android:textColor="#000" android:textSize="16sp" android:textStyle="normal" /> </LinearLayout> </LinearLayout>
MainActivity.javaは以下のようにする。
package sample.at; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private EditText editText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); editText = (EditText) findViewById(R.id.editText); Button buttonRed = (Button) findViewById(R.id.buttonRed); buttonRed.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeColor(Color.argb(255, 255, 0, 0)); } }); Button buttonGreen = (Button) findViewById(R.id.buttonGreen); buttonGreen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeColor(Color.argb(255, 0, 255, 0)); } }); } private void changeColor(int color) { textView.setTextColor(color); textView.setText(editText.getText().toString()); } }
Buttonのイベントの受け方は、先のEditTextの例と異なり、無名クラスを使用している。実装しているインターフェースは、ButtonクラスのインナークラスのOnClickListenerである。オーバーライドすべきメソッドはonClickのみである。その名の通り指定のViewがクリックされたときにイベントが発生する。
実行結果は以下のようになる。
また、Androidの話ではなくJavaの話だが、上記のイベント処理は以下のように書くこともできる。
package sample.at; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private TextView textView; private EditText editText; private Map<View, Integer> colorMap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); editText = (EditText) findViewById(R.id.editText); Button buttonRed = (Button) findViewById(R.id.buttonRed); buttonRed.setOnClickListener(ocl); Button buttonGreen = (Button) findViewById(R.id.buttonGreen); buttonGreen.setOnClickListener(ocl); colorMap = new HashMap<View, Integer>(); colorMap.put(buttonRed, Color.argb(255, 255, 0, 0)); colorMap.put(buttonGreen, Color.argb(255, 0, 255, 0)); } private OnClickListener ocl = new OnClickListener() { @Override public void onClick(View v) { textView.setTextColor(colorMap.get(v)); textView.setText(editText.getText().toString()); } }; }
EditTextの例と同様でButton.OnClickListenerの無名クラスを定義して、buttonRed、buttonGreeの両方のイベントを1つのメソッドで処理している。onClickでは実際にクリックされたViewが引数として渡されるので、どのボタンが押されたかを判断し処理を分けている。
この例で、もう1つ別の方法の実装方法を以下に示す。
package sample.at; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { private TextView textView; private EditText editText; private Map<View, Integer> colorMap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); editText = (EditText) findViewById(R.id.editText); Button buttonRed = (Button) findViewById(R.id.buttonRed); buttonRed.setOnClickListener(this); Button buttonGreen = (Button) findViewById(R.id.buttonGreen); buttonGreen.setOnClickListener(this); colorMap = new HashMap<View, Integer>(); colorMap.put(buttonRed, Color.argb(255, 255, 0, 0)); colorMap.put(buttonGreen, Color.argb(255, 0, 255, 0)); } @Override public void onClick(View v) { textView.setTextColor(colorMap.get(v)); textView.setText(editText.getText().toString()); } }
OnClickListenerを実装することで、自身でonClickメソッドを実装することができる。