我搜索了有关解除对话 onTouchOutside 的所有答案,但是,我在我的应用程序中使用 DialogFragment 。当用户在 DialogFragment 区域外点击时,如何解除 DialogFragment 。
我已经检查了对话的source code 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 的方法,如果可能,还可以使用示例代码?
答案 0 :(得分:34)
答案很简单:
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。
答案 1 :(得分:11)
在大多数情况下,getDialog()为null,因为在创建对话框的新实例后,您将无法立即获取它。
如上所述,onViewCreated
对DialogFragment
也不正确,尤其是在使用android.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);
}
答案 2 :(得分:4)
为什么不覆盖onCreateDialog
并将其设置在那里。这样您就不必一直在getDialog()
呼叫上检查空值。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog d = super.onCreateDialog(savedInstanceState);
d.setCanceledOnTouchOutside(false);
return d;
}
答案 3 :(得分:0)
我正在阅读:http://developer.android.com/reference/android/app/DialogFragment.html
它声明:“控制对话框(决定何时展示,隐藏,解除它)应该通过API在这里完成,而不是直接调用对话框。”
答案 4 :(得分:0)
我已经回答了另一个问题,但答案更适合这个问题,My solution。在此简要介绍一下,我只是实施了onTouch()
DialogFragment
getView()
{{1}}并检查了触摸范围。