小编典典

防止Android活动对话框因外部触摸而关闭

java

我有一个使用Theme.Dialog样式的活动,因此它是另一个活动上方的浮动窗口。但是,当我在对话框窗口外部(在后台活动上)单击时,对话框关闭。如何停止这种行为?


阅读 327

收藏
2020-09-08

共1个答案

小编典典

这可以为您提供帮助。这是处理外部触摸事件的一种方式:

在窗口外触摸时如何取消以活动为主题的对话框?
只是想指出,有是一种方式来获得对话框般从主题作为一个对话的活动“触摸外面取消”的行为,虽然我还没有完全调查它是否有不必要的副作用。

在创建视图之前,在Activity的onCreate()方法中,将在窗口上设置两个标志:一个将其设置为“非模态”,以允许除活动视图之外的其他视图接收事件。第二种是接收到其中一个事件已发生的通知,这将向您发送ACTION_OUTSDIE移动事件。

如果将活动的主题设置为对话框主题,则将获得所需的行为。

看起来像这样:

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()) {
      finish();
      return true;
    }

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

我认为通过抓住事件而不采取任何措施,您可以防止比赛结束。但是,奇怪的是,活动对话框的默认行为是当您触摸外部时 关闭自身。

(PS:代码使用WindowManager.LayoutParams)

2020-09-08