「よろしいですか?」と尋ねるdialog fragment
を作りたい「はい/いいえ」で返信します。
ドキュメント を見てきましたが、高度なダイアログボックスを作成する方法を説明しているが、非常に冗長で、あちこちに行きましたが、単純な「hello world」のようなダイアログボックスを作成するための完全なコードはありませんでした。ほとんどのチュートリアルでは、非推奨のダイアログボックスシステムを使用します。 公式ブログ は不必要に複雑で理解しにくいようです。
それでは、本当に基本的なアラートダイアログを作成して表示する最も簡単な方法は何ですか?サポートライブラリを使用している場合のボーナスポイント。
DialogFragmentは、実際にはダイアログをラップする単なるフラグメントです。 DialogFragmentのonCreateDialog()メソッドでダイアログを作成して返すことにより、そこにあらゆる種類のダイアログを配置できます。
DialogFragmentの例を次に示します。
class MyDialogFragment extends DialogFragment{
Context mContext;
public MyDialogFragment() {
mContext = getActivity();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
alertDialogBuilder.setTitle("Really?");
alertDialogBuilder.setMessage("Are you sure?");
//null should be your on click listener
alertDialogBuilder.setPositiveButton("OK", null);
alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
}
ダイアログ呼び出しを作成するには:
new MyDialogFragment().show(getFragmentManager(), "MyDialog");
そして、どこかからダイアログを閉じるには:
((MyDialogFragment)getFragmentManager().findFragmentByTag("MyDialog")).getDialog().dismiss();
そのコードはすべて、サポートライブラリクラスを使用するようにインポートを変更するだけで、サポートライブラリと完全に連携します。
Kotlinおよび Anko を使用したコーディングでは、4行のコードでダイアログを実行できます。
alert("Order", "Do you want to order this item?") {
positiveButton("Yes") { processAnOrder() }
negativeButton("No") { }
}.show()
アクティビティ/フラグメントライフサイクルのため@ athorおよび@lugsprogアプローチは失敗する可能性がありますよりエレガントな方法は、**メソッドonAttachからアクティビティコンテキストを取得し、弱参照として保存する** (DialogFragment!でデフォルト以外のコンストラクターを避け、ダイアログに引数を渡すために引数を使用してください)次のようになります:
public class NotReadyDialogFragment extends DialogFragment {
public static String DIALOG_ARGUMENTS = "not_ready_dialog_fragment_arguments";
private WeakReference<Context> _contextRef;
public NotReadyDialogFragment() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
/** example pulling of arguments */
Bundle bundle = getArguments();
if (bundle!=null) {
bundle.get(DIALOG_ARGUMENTS);
}
//
// Caution !!!
// check we can use contex - by call to isAttached
// or by checking stored weak reference value itself is not null
// or stored in context -> example allowCreateDialog()
// - then for example you could throw illegal state exception or return null
//
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(_contextRef.get());
alertDialogBuilder.setMessage("...");
alertDialogBuilder.setNegativeButton("Przerwij", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
return alertDialogBuilder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
_contextRef = new WeakReference<Context>(activity);
}
boolean allowCreateDialog() {
return _contextRef !== null
&& _contextRef.get() != null;
}
編集:&ダイアログを閉じたい場合:
このようなもの :
NotReadyDialogFragment dialog = ((NotReadyDialogFragment) getActivity().getFragmentManager().findFragmentByTag("MyDialogTag"));
if (dialog != null) {
Dialog df = dialog.getDialog();
if (df != null && df.isShowing()) {
df.dismiss();
}
}
EDIT2:&ダイアログをキャンセル不可に設定したい場合は、onCreatweDialogのreturnステートメントを次のように変更する必要があります。
/** convert builder to dialog */
AlertDialog alert = alertDialogBuilder.create();
/** disable cancel outside touch */
alert.setCanceledOnTouchOutside(false);
/** disable cancel on press back button */
setCancelable(false);
return alert;