arrow_back

イベントをハンドリングする

「さてさて、入力は必ずしも文字だけとは限らないよね。 ボタンを押したらメッセージを送信する。このボタンを押すというのも入力。 もっと広く捉えれば、マイクやAndroid端末のセンサーから得られる情報も入力だよ」
「センサー?」
「端末がどういう状態にあるのか知るための機械のこと。 Android端末には、状態を知るためのセンサーがたくさん詰まっているの。 傾きや端末が振られたことを検知する"加速度センサー"が有名かな」
「あ、そっか。振って遊ぶゲームもあるもんね」
「そうそう。それじゃあ今度は画面にボタンを追加して、押されたときにEditTextに入力されてる内容を表示するようにしてみよう」

Buttonを配置

activity_main.xmlにボタンを追加……EditTextをコピーして。ボタンは……Buttonでいいのかな。 idを書き換えて、あと配置はEditTextの下にしよう」
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/textview"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/edittext"
        android:text="button"/>

</RelativeLayout>
「表示されたよ! 場所もバッチリ!」
「それじゃあ今度は画面にボタンを押してみて」
「あれ、ぺこぺこするだけで、なにもならないよ?」
「ボタンを押したときにどういう処理をするか。まだ作ってないからね」

Buttonを押したときの処理

「じゃあ、ボタンを押したときにどんな処理をするのか。プログラムしてみるよ」
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView textView = (TextView) findViewById(R.id.textview);
        final EditText editText = (EditText) findViewById(R.id.edittext);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText(editText.getText().toString());
            }
        });

    }
「わぁ、なんかごっちゃりしてるよ。形の違う括弧がいっぱいある!」
「ごちゃごちゃしてるのは否定できないなぁ…… これでも、もういらなくなったTextViewとEditTextのあれこれは消したんだけど……」
「これ、全部入力しないといけないの?」
「その答えは半分Yesだよ。 プログラムが不完全だと……例えば閉じる括弧の一つでも欠ければきちんと処理できなくなる」
「間違えない自信ないよ……」
「大事なのは、setOnClickListenerの括弧の中に new OnClickListenerをいれるってこと」
        button.setOnClickListener();
「だから、先にsetOnClickListenerだけ書く。 そうすれば後ろの括弧の数が合わなくなるってことはなくなるから」
「エラーにならないの?」
「なるよ。この時点ではね。 次に括弧の中にカーソルを合わせてnew OnClickListenerを書いてみて」
「あれ?」
「ほらね。Android Studioが補完してくれるの。 この状態でEnterを押せば、ごちゃごちゃした部分を勝手に書いてくれるよ。 とは言っても補完に頼りきりだと、いざって時に困るから、書き方自体は覚えておくんだよ」
「が、がんばってみるよ……!」
「ボタンを押したら同じ文字が表示されるようになったよ!」

final修飾子

「ところで杏ちゃん。TextViewとEditTextにfinalってつけたんだけど、なにか意味があるの?」
        final TextView textView = (TextView) findViewById(R.id.textview);
        final EditText editText = (EditText) findViewById(R.id.edittext);
「あ、気づいちゃったか…… finalっていうのは"変数の修飾子"と呼ばれるもので、これをつけると変数に再代入できなくなるんだよ」
「なるほど。なんとなく、わかる気が……しない」
「だよね。やっぱり、やってみた方がはやいね。 次のプログラムを実行したら、画面には2が表示されるよね?」
        int value = 1;
        value = 2;
        textView.setText(String.valueOf(value));
「じゃあ次はこれ。変数valueにfinal修飾子をつけた状態」
        final int value = 1;
        value = 2;
        textView.setText(String.valueOf(value));
「あ、怒られちゃった」
「ね。変数の宣言時にfinalをつけると、その変数には再代入できなくなる」
「変数って、変えられるから変数なんでしょ? なんのためにわざわざ変えられなくするの?」
「ある処理の中で変えたくない値をミスで変更しちゃうことがあるんだよ。 finalをつけておくとそれを防ぐことができる。 変えてもいいと確実に言える変数以外には、なんでもfinalをつけるプログラマーもいるよ」
「んー、けど、それとさっきのTextViewとかとなんの関係があるの? TextViewに……なんだっけ。 再代入をしてるわけじゃないよね?」
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView textView = (TextView) findViewById(R.id.textview);
        final EditText editText = (EditText) findViewById(R.id.edittext);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setText(editText.getText().toString());
            }
        });

    }
「じゃあ、ためしにfinalをとってみたら?」
「あ、そうか。やってみるね」
「また怒られた……」
「OnClickListenerの中からTextViewを操作できないって言われてる。 で、final修飾子をつければそれができるようになる。これはAndroidじゃなくてJava言語での決まりごとだよ」
「Java言語は決まり事が多いんだねぇ。頭がクラクラして来ちゃうよ」
「さて修飾子の話題が出てきたから、ついでに変数のスコープについて説明しておくね」
「スコープ……また英語……エイゴキライ」
最終更新日: 2015/09/03