55

DialogFragment を作成してポップアップできる Fragment がありますが、[戻る] ボタンを押すと、明示的に setCancelable(false); を呼び出してもダイアログが閉じます。私の DialogFragment が戻るボタンを感知しないようにする方法はありますか?

public class LoadingDialogFragment extends DialogFragment
{
    String title;
    String msg;

    public LoadingDialogFragment()
    {
        this.title = "Loading...";
        this.msg = "Please wait...";
    }
    public LoadingDialogFragment(String title, String msg)
    {
        this.title = title;
        this.msg = msg;
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState)
    {
        final ProgressDialog dialog = new ProgressDialog(getActivity());

        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setIndeterminate(true);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);

        return dialog;
    }

}

AsyncTask から DialogFragment を作成します。

private class GpsTask extends AsyncTask<String, Integer, Integer>
{
    //ProgressDialog dialog;
    @Override
    protected void onPreExecute()
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock...");
        ft.addToBackStack(null);
        newFragment.show(ft, "dialog");
    }

    @Override
    protected Integer doInBackground(String... params)
    {
        //acquire a GPS lock and grab a few position updates
    }

    @Override
    protected void onProgressUpdate(Integer... input) { }

    @Override
    protected void onPostExecute(Integer result)
    {
        getSupportFragmentManager().popBackStackImmediate();
    }
}
4

5 に答える 5

135

を使用してはsetCancelableどうですか?試してみましたか?

ドキュメントから:

表示されたダイアログがキャンセル可能かどうかを制御します。DialogFragment はこれに基づいて動作を変更する必要があるため、Dialog.setCancelable(boolean) を直接呼び出す代わりにこれを使用します。

カスタム DialogFragment の場合

isCancelable = falseで追加onCreateDialog

于 2012-04-16T09:47:43.437 に答える
4

これが FragmentDialogs で機能するかどうかはまったくわかりませんが、setCancelable が機能しない場合は、次の記事をご覧になる価値があるかもしれません: Android: Prompt user to save changes when Back button is pressed

戻るボタンが押されたことを検出する方法を説明します。ボタンを押すのを抑えると、ダイアログが閉じるのを止めることができますか?

于 2012-04-16T09:55:39.940 に答える
3

onCreateDialogonCreateView:

実装では、このクラスをオーバーライドし、onCreateView(LayoutInflater, ViewGroup, Bundle) を実装して、ダイアログのコンテンツを提供する必要があります。または、onCreateDialog(Bundle) をオーバーライドして、AlertDialog などの完全にカスタムのダイアログを独自のコンテンツで作成することもできます。

使用時の重要事項onCreateDialog:

オーバーライドして、独自のカスタム Dialog コンテナを構築します。これは通常、一般的なダイアログの代わりに AlertDialog を表示するために使用されます。その場合、AlertDialog が独自のコンテンツを処理するため、onCreateView(LayoutInflater, ViewGroup, Bundle) を実装する必要はありません。

Dialog(この場合はAlertDialog):

public static class MyAlertDialogFragment extends DialogFragment {

    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");

        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setCanceble(false)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
} 

このプロパティは、バック プレスで をsetCanceble(boolean)終了できるかどうかを示します。Dialogどこでも KEYCODE_BACK をキャッチする必要はありません。

于 2013-03-14T15:05:55.637 に答える
3

それはあなたを助けるかもしれません。

newFragment.setCancelable(false); 

以下のサンプルのように、DialogFragment オブジェクトを作成するとき、またはカスタム DialogFragment のコンストラクターで上記のような変更を行います。

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener)
        {
            CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();            
            CustomClearHourDialog.listener = listener;
            clearHourDialog.setCancelable(false);
            return clearHourDialog;
        }
于 2016-10-13T11:38:20.997 に答える