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