ダイアログの外側を押したときにDialogFragmentを閉じるにはどうすればよいですか?


80

を使用していてDialogFragment、押したときにダイアログを閉じる(つまり閉じる)ように画像を設定できましたが、ユーザーがダイアログの外側をクリックしたときにダイアログを閉じる方法を見つけるのに苦労しています。通常のダイアログ。ある種あると思いました

dialogFragment.setCanceledOnTouchOutside(true);

呼び出しますが、ドキュメントには表示されません。

これDialogFragmentはまったく可能ですか?それとも私は間違った場所を探していますか?「親」アクティビティでタッチイベントをインターセプトしようとしましたが、タッチイベントが発生しないことを除けば、私には正しくないようでした。

回答:


177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

onCreateView(Apurv Guptaが指摘したように)呼び出される必要があります。


34
呼び出す必要がありますonCreateView
Apurv Gupta 2014

キャンセルせずに閉じるだけの場合はどうなりますか?
jjxtra 2015

58
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }

вмоемслучаеgetDialog()。setCanceledOnTouchOutside(true); несработало、сработалоgetDialog()。dismiss();
МаксимФомичёв

@МаксимФомичёв、впервомслучаепроисходитустановкасвойствадиалога、чтоегоможнозакрывать Вовторомслучаевысамипрограммнозакрываетедиалог。
CoolMind

21
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }

これは私にはうまくいきませんでした。@Apurvのように電話setCanceledOnTouchOutsideしなければなりonCreateViewませんでした。私が電話したことを言及する必要がありますsetCanceledOnTouchOutside(false)
kimbaudi 2016年

8

ここにはたくさんの答えがありますが、ダイアログを開くとアプリがクラッシュします。書き込みgetDialog().setCanceledOnTouchOutside(true);内部をonCreateViewせず、アプリがクラッシュしました。

(私はAppCompatActivityBaseActivityとして使用していますandroid.app.DialogFragmentFragmentとして)。

動作するのは、次の2行のいずれかです。

getDialog()。setCanceledOnTouchOutside(true);

または

this.getDialog()。setCanceledOnTouchOutside(true);

中のonActivityCreatedように

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

使用しないもの:

DialogFragment.getDialog()。setCanceledOnTouchOutside(false);

次のエラーをスローします

ここに画像の説明を入力してください

そして、でコードを書くとonCreateViewアプリがクラッシュします!何か問題を見つけた場合は、回答を更新してください。


おそらくこれは、内部onCreateDialog()にダイアログを作成するためです。これは通常の初期化方法です。この場合、onCreateView()何も実行せず、ビューも含まれません。コードをに移動してみてくださいonCreateDialog()
CoolMind

@CoolMindああ、それは素晴らしい観察です。きっとこれを私のトライリストに残しておくでしょう。ありがとう!
sud0 0719

それにもかかわらず、あなたの答えは意味を成し、4人がプラスとマークしたと思います。またonCreateDialogonCreateView過去に、で問題が発生しました。たぶん私は間違っているので、保持する必要がありますonActivityCreated。これは、追加の初期化を行うための優れた方法です(たとえば、stackoverflow.com / a / 50734566/2914140を参照してください)。
CoolMind

@CoolMindはあなたのために働く素晴らしい。しかし、あなたが経験している問題はあなたのBottomSheet実装によるものであることに気付くことができます。私が同意するBSheetの場合は異なるかもしれません。しかし、このソリューションはDialogFragmentうまく機能します。
sud0 0719

3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

それはタイプミスでした。私も同じ問題を抱えていました。これはJavaの場合は正常に機能し、Androidの場合はMonoは次のようになります。

this.getDialog().SetCanceledOnTouchOutside(false);

しかし、誰がモノについて何か尋ねましたか?:/
m0skit0 2018年

1
            Dialog.SetCanceledOnTouchOutside(true);

私のために働いた
私のコード

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }

1

の外側をクリックしたときにロジックを実行する場合はDialogFragment、onCancelメソッドをオーバーライドするだけです。

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}

0

上記のソリューションを試した後でのみ、自分のソリューションを使用することをお勧めします。ここで私の解決策を説明しました。簡単に言うと、DialogFragment.getView()のタッチ境界をチェックしています。タッチポイントがDialogFragmentの外にある場合、Dialogを閉じています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.