40

dialog fragment「よろしいですか?」という質問をしたいのですが。「はい/いいえ」の返信があります。

ドキュメントを見てきましたが、非常に冗長で、高度なダイアログボックスの作成方法を説明していますが、単純な「HelloWorld」のようなダイアログボックスを作成するための完全なコードはありません。ほとんどのチュートリアルは、非推奨のダイアログボックスシステムを利用しています。公式ブログは不必要に複雑でわかりにくいようです。

では、本当に基本的なアラートダイアログを作成して表示する最も簡単な方法は何ですか?サポートライブラリを使用している場合はボーナスポイント。

4

4 に答える 4

80

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();

そのコードはすべて、サポートライブラリクラスを使用するようにインポートを変更するだけで、サポートライブラリと完全に連携します。

于 2012-10-16T10:24:17.953 に答える
12

では、本当に基本的なアラートダイアログを作成して表示する最も簡単な方法は何ですか?サポートライブラリを使用している場合はボーナスポイント。

(SDKまたはサポートライブラリ)を作成し、DialogFragmentそのメソッドをオーバーライドして、目的のテキストとボタンが設定されたonCreateDialogを返すだけです。AlertDialog

public static class SimpleDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setMessage("Are you sure?")
                .setPositiveButton("Ok", null)
                .setNegativeButton("No way", null)
                .create();
    }

}

ユーザーがボタンの1つを使用するときに何かを行うには、私のコードからDialogInterface.OnClickListenerの参照の代わりに、のインスタンスを提供する必要があります。null

于 2012-10-16T10:14:39.670 に答える
5

KotlinとAnkoを使用してコーディングする場合、4行のコードでダイアログを実行できるようになりました。

alert("Order", "Do you want to order this item?") {
    positiveButton("Yes") { processAnOrder() }
    negativeButton("No") { }
}.show()
于 2016-10-26T00:04:17.443 に答える
2

アクティビティ/フラグメントのライフサイクル @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;
     }

編集: &ダイアログを閉じたい場合:

  1. それを取得してみてください
  2. 存在するかどうかを確認します
  3. 表示されているかどうかを確認します
  4. 解散

このようなもの :

        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;
于 2015-06-25T16:32:52.277 に答える