ポップアップメッセージ

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クラスに含まれる、よく使われるメソッドは次の通りです。

setMessage()

メッセージ本体。String型又はリソースID

setTitle()

ダイアログのタイトルバーに現れるテキスト又はアイコン

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アプリの中で多用されています。