コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

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メソッドを実装することができる。