zoukankan      html  css  js  c++  java
  • [Android]对话框样式Activity获得窗口外点击事件

      Dialog除了使用Dialog类来实现之外,还可以使用Dialog样式的Activity来实现,只需要在注册Activity时指明theme为adnroid:Theme.Dialog就行,这样的Dialog因为实际上是个Activity而更加丰富灵活。在API11(如果没记错的话)之前的dialog样式Activity是模式的,点击对话框外部对话框不会消失,而API11之后虽然依然是模式的,但点击对话框外部后对话框消失,相当于点击了返回键。

      如何人为控制点击对话框(Activity)外部时窗口是否销毁呢?在API11之后添加了setFinishOnTouchOutside()方法,只需要在onCreate()方法中调用:

    this.setFinishOnTouchOutside(false);

     就可以设置点击对话框外部是否消失,但API11之前没有这个方法,也就是说API11之前没有现成的方法能够实现点击dialog样式Activity外部对话框消失,所以真正监听这个点击事件才是根本解决方法。

      Stackoverflow上有人给出了一种非常有效的思路。首先在View创建之前设置两个Flag,一个设置窗口为非模式的,这样除窗口外的内容就可以获得touch事件,然后设置窗口外部touch事件发生时的通知。最后重写onTouchEvent,监听窗口外的Touch事件。这样就可以在监听方法中自定义窗口外点击事件的响应,是否关闭窗口或者其他操作。

    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);
      }
    }
  • 相关阅读:
    获取短信验证码(60s)-input
    springboot环境搭建(基于eclipse插件)
    【python】hanio【汉诺塔】
    Integer 和 Long 类型之间转换
    ora-12638 credential retrieval failed
    win7变热点
    MyEclipse的Expressions没有结果的解决办法
    MyEclipse运行到断点也跳过的问题
    org.hibernate.PropertyNotFoundException: Could not find a getter for employee in class com.itcast.f_hbm_oneToMany.Department
    "Debugging not possible in single session mode"
  • 原文地址:https://www.cnblogs.com/lcyty/p/3426946.html
Copyright © 2011-2022 走看看