Androidアプリのイベント処理とFragment
前回のおさらいと今回のテーマ
前回はAndroidタブレットアプリを作るための環境構築と簡単なサンプルアプリを作りました。Androidタブレットアプリを作る上で最低限必要な準備ができたかと思います。
今回はまず、前回作成したサンプルアプリをもとに、Androidのイベント処理の基本と注意点を説明します。ボタンがタップされた場合など、入力イベントが発生した時の処理の書き方や、イベント処理で気をつける点を説明します。
後半では、AndroidタブレットアプリにはかかせないFragment機能について、どのような機能か説明し、Fragment機能を使ったサンプルアプリを作ってみます。
Androidのイベント処理について
アプリを使っているユーザーが「画面上のボタンを押した」「戻るキーを押した」などの入力イベントが発生した場合、アプリでは発生した入力イベントに応じた処理を行うことができます。
アプリ開発では、複数のコンポーネントが、配置された画面から発生する各入力イベントに応じた処理を記述し、画面遷移を行ったり、通信を行ったりしてデータの取得などを行います。
イベント処理の記述方法
まずは前回作ったサンプルアプリをもとにAndroidのイベント処理の記述方法について説明します。Eclipseを起動して、前回作ったHelloTabletプロジェクトのHelloTabletActivity.javaを表示してください。
前回、HelloTabletActivity.java に以下のような処理を追加しました。
// button1をクリックした時に処理を実行できるようにする findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // button1をクリックした際の処理を記述する // ここではAlertDialogを作成し、ダイアログに表示するメッセージの設定と、 // ダイアログのOKボタンを押した時にダイアログが閉じる処理を記述している new AlertDialog.Builder(HelloTabletActivity.this). setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }).setMessage("ボタンを押しました").show(); } });
この追加した処理がイベント処理の記述となります。
ここでは、画面上に追加したボタンをタップした際にダイアログを表示する処理を記述しています。基本的なイベント処理記述の流れとしては、
- 処理対象となるコンポーネントを決める(2行目のfindViewById()メソッド)
- どの入力イベントに対する処理かを決める(2行目のsetOnClickListener()メソッド)
- 入力イベントに応じた処理を記述する(4行目のView.OnClickListenerインターフェースのonClick()メソッド)
となります。 イベント処理は各イベントに応じて変わるので、上記コードのように匿名クラスで記述することが一般的です(もちろん、Interfaceを実装したクラスを作成し、それを設定してもかまいません)。
なお、匿名クラスで記述する場合は以下の点に注意して記述してください。
- 匿名クラス内のメソッドで呼び出し側のローカル変数を参照する場合、呼び出し側のローカル変数にfinalをつける必要がある
- 匿名クラス内で呼び出し側のthisを参照したい場合、クラス名.this とする必要がある
「AndroidアプリからJavaをはじめました。」という場合、上記の制約があることを知らないために匿名クラスからアクセスされる変数はなんでもActivityのインスタンス変数にしてる場合があるので、そういうコードを見たらやんわり指摘してあげてください。
主な入力イベントの種類
Androidで用意されている主な入力イベントの種類について説明します。
各イベントにはイベントに応じた処理を定義できるインターフェースが用意されていますので、それも合わせて紹介します。
- ・クリックイベント
- コンポーネントをクリックした際に発生する入力イベントです。ボタンをタップした際にイベント処理を行う場合も、この入力イベントに対して処理を定義します。
Android側で用意されているインターフェースは View.OnClickListener インターフェースとなります。アプリではこのインターフェースを実装したクラスを View#setOnClickListener() メソッドでコンポーネントの入力イベントに結びつけます。
実際の使用例は先ほどの HelloTabletActivity.java をご確認ください。 - ・タッチイベント
- コンポーネントをタッチした際に発生する入力イベントです。
クリックイベントとの違いは取得できる情報の違いとなります。タッチイベントでは「コンポーネントに触れた」「コンポーネントから離れた」「コンポーネント上で指を動かした」などの情報が取得できます。
Android側で用意されているインターフェースは View.OnTouchListener インターフェースとなります。アプリではこのインターフェースを実装したクラスを View#setOnTouchListener() メソッドでコンポーネントの入力イベントに結びつけます。
タッチイベントはその性質上、クリックイベントより先にイベント通知が行われます。そのため、同一のコンポーネントにタッチイベントとクリックイベントを設定する場合は注意が必要です。
例えば、先ほどの HelloTabletActivity.java に以下のコードを追加して実行してみてください。
// button1にタッチイベントを設定 findViewById(R.id.button1).setOnTouchListener( new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return true; } });
- 上記のコードを追加すると、ボタンを押してもダイアログが表示されなくなります。
これは View.OnTouchListener#onTouch() メソッドtrueを返し、「タッチイベントに関する処理は終了した。」とAndroid Frameworkに通知しているため、それ以降のタッチに関するイベント通知が行われなくなるためです。
上記のコードの return true; の部分を return false; とするとダイアログが表示されるようになります。
このように、タッチイベントとクリックイベントを同時に設定する場合はMotionEventを確認し、どのイベントはタッチイベントとして処理するかを決めて実装を行うようにしてください。 - ・戻るキーイベント
- 戻るキーの入力イベントはコンポーネントに設定するのではなく、画面であるActivityに設定します。Activity#onBackPressed()メソッドを対象となるActivityクラスでオーバーライドしてください。
例えば、戻るキーでアプリを終了するのではなく、確認ダイアログを出したい場合は HelloTabletActivity.java に以下のコードを追加してみてください。戻るキーに反応してダイアログが表示されるようになります。
@Override public void onBackPressed() { new AlertDialog.Builder(HelloTabletActivity.this).setPositiveButton("終了", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which) { HelloTabletActivity.this.finish(); } }).setNegativeButton("Cancel", null).setMessage("終了しますか??").show(); }
図1:戻るキーを押した際の実行結果(クリックで拡大) |
その他にも設定することができる入力イベントはありますので、以下のURLをご確認ください。
→参照:Input Events | Android Developers