为了账号安全,请及时绑定邮箱和手机立即绑定

对话框样式的Activity获得窗口外点击事件

标签:
Android

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

如何实现Dialog样式的Activity

values目录下创建一份style.xml文件,内容如下:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

11

<?xml version="1.0" encoding="utf-8"?>

<resources>

  <style name="dialog" parent="@android:style/Theme.Dialog">

     <item name="android:windowFrame">@null</item>

     <item name="android:windowIsFloating">true</item>

     <item name="android:windowIsTranslucent">true</item>

     <item name="android:windowNoTitle">true</item>

     <item name="android:windowBackground">@android:color/transparent</item>

     <item name="android:backgroundDimEnabled">true</item>

 </style>

 </resources>

在AndroidManifest.xml中,将以对话框形式显示的Activity设置 上面的样式

[代码]xml代码:

?

1

<activity android:name=".DialogActivity" android:theme="@style/dialog"/>

如何人为控制点击对话框(Activity)外部时窗口是否销毁呢?

在API11之后添加了setFinishOnTouchOutside()方法,只需要在onCreate()方法中调用:

[代码]xml代码:

?

1

this.setFinishOnTouchOutside(false);

或者在res\values\styles.xml样式里添加:

[代码]xml代码:

?

1

2

3

4

5

<resources>   

    <style name="Dialog" parent="@android:style/Theme.Holo.DialogWhenLarge">     

        <item name="android:windowCloseOnTouchOutside">false</item>     

    </style>     

</resources>

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

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

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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);

  }

}

原文链接:http://www.apkbus.com/blog-705730-62429.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消