【Android】ダイアログ表示用の再利用がきれいになる短いコード


ダイアログを簡単に呼び出す用のスニペットです。

何度も同じような処理を作るのはよろしくないので
リフレクションを使うパターンです。

一度共通クラスやツールクラスに設定すれば、
簡単に呼び出せるように、リフレクションを使っています。
(セキュリティ上使うときにメソッドの引数は固定化しておいてください)

使用例: Tool クラスに宣言したメソッドshowDialog(後述)を呼び出す

1回あたりの呼び出しは、以下のように短くなります。
(OK/NGなどの2択ダイアログのみ)

        showDialog(getString(R.string.title)
                ,getString(R.string.message)
                ,"OK","Cancel","goDeal","ngDeal");

共通コード:Tools.java   staticクラス(invoke時:引数なし)

    private void showDialog( String title , String msg , String OKLabel, String NGLabel,
                                  final String OKMethod , final String NGMethod){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
        alertDialog.setTitle(title).setMessage(msg);

        alertDialog.setPositiveButton(OKLabel, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //OKボタンが押された時の処理
                invoke(OKMethod);
            }});
        alertDialog.setNegativeButton(NGLabel, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //NOボタンが押された時の処理
                invoke(NGMethod);
            }});
        alertDialog.show();
    }

    private void invoke(String methodName){
        if (methodName == null || methodName.length() == 0)
            return;

        Log.d(LOGID, "invoke method: "+methodName);
        Method method;
        try {
            //引数なしメソッド
            method = ((Class<MainActivity>) getClass()).getDeclaredMethod(methodName);
            method.setAccessible(true);
            method.invoke(this);
        }catch (Exception e){
            Log.d(LOGID, Log.getStackTraceString(e));
        }
    }
  • invokeのところで、引数ありにしたい場合、リフレクションのサンプルコードを探して修正してください(Classの配列を指定します)。
  • NGの時、処理なしも指定できます(nullを渡すことが可能)。
  • 少し手を入れて、showDialogのdialogをインスタンス化すれば、しょっちゅうダイアログを作成する場合、省エネになります(今回提示した方法は毎回新規に作るので)。
Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket

748 views.



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です