19

Dialog onTouchOutsideを閉じることに関するすべての回答を検索しましたが、アプリケーションでDialogFragmentを使用しています。ユーザーがDialogFragmentの領域外をクリックしたときに、 DialogFragmentを閉じるにはどうすればよいですか。

ダイアログソースコードsetCanceledOnTouchOutsideを調べました

public void setCanceledOnTouchOutside(boolean cancel) {
    if (cancel && !mCancelable) {
        mCancelable = true;
    }

    mCanceledOnTouchOutside = cancel;
}

isOutOfBoundsである興味深いかもしれない別の関数があります

private boolean isOutOfBounds(MotionEvent event) {
    final int x = (int) event.getX();
    final int y = (int) event.getY();
    final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
    final View decorView = getWindow().getDecorView();
    return (x < -slop) || (y < -slop)
    || (x > (decorView.getWidth()+slop))
    || (y > (decorView.getHeight()+slop));
}

しかし、 DialogFragmentにこれらを利用する方法を理解できませんでした

これらに加えて、hierarchyviewer を使用してアプリケーションの状態を調べましたが、理解しているように、ダイアログの領域のみが表示され、その外側の部分(DialogFragmentの後の画面の残りの部分)は表示されません。

DialogFragmentにこのsetCanceledOnTouchOutsideを実装する方法を提案できますか?可能であればサンプルコードを使用してください。

4

5 に答える 5

36

答えは非常に簡単です。

MyDialogFragment fragment = new MyDialogFragment(); // init in onCreate() or somewhere else
...
if ( fragment.getDialog() != null )
    fragment.getDialog().setCanceledOnTouchOutside(true); // after fragment has already dialog, i. e. in onCreateView()

DialogFragmentsのダイアログの詳細については、http: //developer.android.com/reference/android/app/DialogFragment.html#setShowsDialog%28boolean%29を参照してください。

于 2012-02-14T14:11:40.873 に答える
11

ダイアログの新しいインスタンスを作成した直後には getDialog() を取得できないため、ほとんどの場合、getDialog() は null です。

上記で提案したように、特に を使用する場合onViewCreatedも正しくありません。DialogFragmentandroid.support.v4.app.DialogFragment

以下は、に配置されているため、うまく機能しますonCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (getDialog() != null) {
        getDialog().setCanceledOnTouchOutside(true);
    }
    return super.onCreateView(inflater, container, savedInstanceState);
}
于 2013-12-13T11:19:39.203 に答える
5

オーバーライドonCreateDialogしてそこに設定するだけではどうですか。そうすれば、getDialog()呼び出しで常に null をチェックする必要がなくなります。

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
     Dialog d =  super.onCreateDialog(savedInstanceState);
     d.setCanceledOnTouchOutside(false);
     return d;
 }
于 2014-11-22T07:35:26.543 に答える