【问题标题】:How to detect when user touch outside the dialog fragment?如何检测用户何时在对话框片段之外触摸?
【发布时间】:2016-10-04 08:44:07
【问题描述】:

当用户触摸 对话框片段 之外时,我想执行一些任务。我该怎么做?

  • 在我的自定义对话框片段中,有一段代码可以防止在触摸外部时关闭对话框:

    getDialog().setCanceledOnTouchOutside(false);

【问题讨论】:

  • @PierGiorgioMisley :我希望有一种机制来处理用户在对话框外触摸时的任何自定义操作,而不仅仅是为了解雇。

标签: android dialog android-dialogfragment


【解决方案1】:

然后您需要删除getDialog().setCanceledOnTouchOutside(false); 并使用一些反射来利用Window 的隐藏方法来决定何时关闭对话框:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    return object : Dialog(activity as Context, theme) {
        override fun onTouchEvent(event: MotionEvent): Boolean {
            if (dialogShouldCloseOnTouch(window, context, event)) {
                // do custom logic
                return true
            } else {
                return super.onTouchEvent(event)
            }
        }
    }
}

private fun dialogShouldCloseOnTouch(
    window: Window, 
    context: Context, 
    event: MotionEvent): Boolean {
    val method = window.javaClass.getMethod("shouldCloseOnTouch", Context::class.java, MotionEvent::class.java)
    return method.invoke(window, context, event) as Boolean
}

【讨论】:

  • 你真的很酷。真的行。我试图找出任何解决方案几个小时。很酷!
  • @DYS,它在某些设备上不起作用。错误:“原因:java.lang.NoSuchMethodException:com.android.internal.policy.PhoneWindow.shouldCloseOnTouch”
  • @XueQing 你能告诉我这些设备的Android版本吗?
  • @DYS,您的代码在模拟器上运行良好。但是由于此类错误,我无法使用该逻辑。我的手机是安卓10版本的。
  • @XueQing 可能是。在这种情况下,您可以简单地尝试将Window.shouldCloseOnTouch 复制粘贴到您的Fragment
【解决方案2】:
public class MyActivity extends Activity {

 @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Make us non-modal, so that others can receive touch events.
    getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);

    // ...but notify us that it happened.
    getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

    // Note that flag changes must happen *before* the content view is set.
    setContentView(R.layout.my_dialog_view);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // If we've received a touch notification that the user has touched
    // outside the app, finish the activity.
    if (MotionEvent.ACTION_OUTSIDE == event.getAction()) {
      //outside touch event
      return true;
    }

    // Delegate everything else to Activity.
    return super.onTouchEvent(event);
  }
}

参考:Look at the second answer here.

附:在问题中,他说他有一个 activitydialog 主题。

【讨论】:

  • 问题是对话片段而不是活动
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
相关资源
最近更新 更多