「Android開発」共通のダイアログの作り方

「OK」のみのDialogFragment を例とする。
(ここに使われるのはandroid.app.DialogFragmentです。低いバージョンには使えないことを注意ください。android:minSdkVersion="11"

public class OkDialog extends DialogFragment {

public static final int TYPE_INFO = 1;
public static final int TYPE_ERROR = 2;

public static OkDialog newInstance(String title, String message) {
OkDialog fragment = new OkDialog();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("message", message);
fragment.setArguments(args);
return fragment;
}

@Override
public Dialog onCreateDialog(Bundle safedInstanceState) {
String title = getArguments().getString("title");
String message = getArguments().getString("message");
AlertDialog.Builder builder = new AlertDialog.Builder(
getActivity(),R.style.MyDialogTheme);

builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
});
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
return dialog;
}

@Override  
public void onDismiss(DialogInterface dialog) {      
// Dialogを閉じた時の処理      
super.onDismiss(dialog);
}

}


ダイアログを呼び出すメソッドで、FragmentTransactionを使う。
理由は下記のURLを参照。
(基本的にはActivityのcallbackが呼ばれた際にはFragmentの同じ様なcallbackが呼ばれる。)
http://d.hatena.ne.jp/sei10sa10/20110919/1316403649

なお、commitAllowingStateLoss、executePendingTransactionsの使うメリットも
例の行間に記述しています。

   /**
* ダイアログ画面を表示する
* @param FragmentActivity メインFragmentManager
* @param DialogFragment ダイアログ対象
* @return なし
*/
public static void showDailog(FragmentManager iFragmentManager,
DialogFragment iObDialog){

final String strTag = "showDailog";

FragmentTransaction fragmentTransaction =
iFragmentManager.beginTransaction();

//すでに起動しているダイアログを閉じる
Fragment prevDialogFragment = iFragmentManager.findFragmentByTag(strTag);
if(prevDialogFragment != null){
fragmentTransaction.remove(prevDialogFragment);
}

//fragmentTransaction.addToBackStack(null);
//呼び出す
fragmentTransaction.add(iObDialog, strTag);
//commit() を使ってトランザクションをコミットできるのは、
//アクティビティが その状態を保存する ( ユーザがアクティビティから離れるとき ) 前だけに限られています。
//その後のタイミングでコミットしようとすると例外が投げられます。
//これはアクティビティが回復しなければならない場合に、
//コミットした後でその状態を消失してしまう可能性があるからです。
//状態を失ってもコミットしてもいい状況で commitAllowingStateLoss() を使用してください。
fragmentTransaction.commitAllowingStateLoss();
//FragmentTransactionとして追加された処理はエンキューされて、
//その後はActivityのライフサイクルメソッド(onStart, onResume, etc..)が実行された時に
//ペンディングされていた処理として実行される。
//現在ペンディング中の処理(コミットされたトランザクションへの追加)を直ちに有効にするため、
//メインスレッドと同期する必要
iFragmentManager.executePendingTransactions();

}

このブログの人気の投稿

ABAP:データファイルのアップロードとダウンロード

ABAPSE12 更新ビュー作成手順

ABAP:]バックグラウンドジョブDEBUG