web-dev-qa-db-ja.com

ダイアログの外側を押したときにDialogFragmentを閉じる方法は?

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

dialogFragment.setCanceledOnTouchOutside(true);

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

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

74
sole
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

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

163
Hamed
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
55
manuzhang
    /** 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;
    }
19
Yakiv Mospan

多くの回答がここにありますが、ダイアログが開くとアプリがクラッシュします。 onCreateView内にgetDialog().setCanceledOnTouchOutside(true);を書き込むと機能せず、アプリがクラッシュしました。

(BaseActivityとしてAppCompatActivityを使用し、Android.app.DialogFragment私のフラグメントとして)。

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

getDialog()。setCanceledOnTouchOutside(true);

OR

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

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

enter image description here

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

5
sud007
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

タイプミスでした。同じ問題がありました。これは、JavaおよびMono for Android Monoは次のようになります。

this.getDialog().SetCanceledOnTouchOutside(false);
2
Eugene Bosikov

上記のソリューションを試した後にのみ、ソリューションを使用することをお勧めします。私のソリューションを説明しました here 。簡単に言うと、DialogFragment.getView()のタッチ境界を確認しています。タッチポイントがDialogFragmentの外側にある場合、ダイアログを閉じています。

0
Swaroop
            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;
            }
    }
0
sham