ポップアップメッセージ
1.ポップアップメッセージ
画面はActivityに対応しています。そのため、何か表示する場合、そのためのActivityが必要です。学習の目的で、途中結果を画面に表示するだけの目的で、そのためのActivityを作成するのは煩わしいものです。Activityを使わないでメッセージを表示する方法を紹介します。常に代替できるわけではありませんが、利用できる場合もあります。
ポップアップメッセージはサービス等バックグラウンドで走るコンポーネントも使えるメッセージ出力のしかけです。
(1)通知(Notification)
(2)Toast Notification 一時的なメッセージ 自動的に消える。フォーカスはActivityが持ったまま。
(3)Alert Dialog Notification
ただし、この時点では学習の負担を軽減するために、途中結果を画面に表示することが目的なので、その目的に沿った機能に限定します。本来の目的に使うには、もっと深く知る必要があります。
1.1Toast
自動的に消えるので、ユーザが見たか否か分からりません(「ユーザが見た」という確証はプログラム側は確認できません)。ユーザが見なくても致命的な問題にならない場合に使います。
例(会話処理に比べ長時間)バックグランドで走るプログラムの完了報告
(まだ致命的でないが)電池が少なくなった旨の報告
形式 詳細はAPIリファレンスを参照 (package:android.widget)
Toast.makeText(Context context, int resId, int duration).show()
Toast.makeText(Context context, String text, int duration) ).show()
context:Activityはcontextを継承しているのでActivityでよい。
duration:LENGTH_LONG又はLENGTH_SHORT(表示の時間:正確な時間でなく相対的な長短を指定)
resId:表示する内容がリソースファイルに設定されているときはそのid(Rクラスで設定されている値)
例
Toast.makeText(this, "webページをアクセスします。" , Toast.LENGTH_LONG).show(); // Activity内では第1引数contextはthisでよい Toast.makeText(this, "サービスRSSを起動。" , Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.rssWarning , Toast.LENGTH_SHORT).show(); |
注:.show()を忘れないように! 忘れても文法的にはチェックされません。
1.2 AlertDialog
フォーカスがダイアログに移り、ユーザがクローズするまで表示し続けます。ユーザが、そのときに見なければならない重要なメッセージを表示するのに使います。
Builderクラスを用いると簡単に使えます。
BuilderクラスのAlertDialogを設定するメソッドは、それぞれBuilderオブジェクトを戻すので、連続して設定メソッドを呼ぶのが簡単です。最後にshowメソッドを呼べば表示されます。
Builderクラスに含まれる、よく使われるメソッドは次の通りです。
1 |
setMessage() |
メッセージ本体。String型又はリソースID |
2 |
setTitle() |
ダイアログのタイトルバーに現れるテキスト又はアイコン |
3 |
setPositiveButton() setNeutralButton() setNegativeButton() |
ダイアログの底辺に沿って表示されるボタン。それぞれ、左、中央、右に配置される。キャプションとクリックしたときの処理を指定します。 |
仕様の詳細は、android.app.AlertDialog、AlertDialog.Builderを参照して下さい。
カスタマイズもできます。その場合は、show()の代わりにcreate()を呼び、途中まで作成されたAlertDialogを元に残りを設定します。その後、show()を呼びます。
例
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Window Title") .setMessage("Message here") .setNeutralButton("Close", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dlg, int num){ ... 中央のボタンが押されたときの処理 }) .show(); |
注1:ボタンをクリックするとAlertDialogは見えなくなる(実際にどうなっているかは不明)。
Javaのおさらい 匿名内部クラスについて
この例はJava言語から見ると、やや複雑な構造をしています。DialogInterface.OnClickListenerは[参考1]のreferencesタブ >> android.contentパッケージ >> DialogInterfaceインタフェース >> OnClickListener インタフェースを参照して下さい(現時点では必須ではありませんが、興味のある方は調べて下さい)。new DialogInterface.OnClickListener()はJavaの内部クラスの匿名クラスです。匿名クラスは実装とインスタンシェートが同じところで行われます。Java研修では学習しました。名前つきの内部クラスを使って書き換えた例を次に示します。
private class MyAlertDialogOnClickListener implements DialogInterface.OnClickListener{ // クラスの名前は適当に付ける。 public void onClick(DialogInterface dlg, int num){ ... 中央のボタンが押されたときの処理 } } MyAlertDialogOnClickListener onClickListener = new MyAlertDialogOnClickListener(); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder. ... .setNeutralButton("Close", onClickListener) .show(); |
外部の独立したクラスとしても、MyAlertDialogOnClickListenerを書き換えできます。複数のクラスから参照される見込みのないクラスは、通常、外部の独立したクラスにはしません。そのため、イベントリスナーは内部クラス、特に匿名内部クラスにされることが多いです。匿名内部クラスに慣れて下さい。intefaceを実装する匿名内部クラスの作り方に注目して下さい。androidアプリの中で多用されています。