遇到一个需要非全屏的类似对话框的Activity的问题,照例现在网上搜一把,发现都是写一个style,写一个drawable设置背景色(一般是半透明)。但是写style的时候,是用dialog做为父类,比如:
<style name="Theme.MyDialog"
parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/dialog_bg</item>
</style>
这样有一个问题,就是在点击对话框外部的时候会Activity消失(这也是应该的,因为Dialog就是如此)。怎么办?找了下Dialog Theme的源代码,注意到有如下片段:
<item name="android:windowFrame">@null</item>
<item name="android:windowTitleStyle">@android:style/DialogWindowTitle</item>
<item name="android:windowBackground">@android:drawable/panel_background</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:windowCloseOnTouchOutside">@bool/config_closeDialogWhenTouchOutside</item>
<item name="android:windowActionModeOverlay">true</item>
- windowCloseOnTouchOutside这个属性即是点击外部是否关闭,设置为false即可。
- windowIsFloating这个属性其实就是Activity是否像对话框一样“飘”在另一个activity前面的关键属性。所以只要加上这个属性,不管这个style的parent是AppTheme还是其他什么的,都可以让Activity看起来“像”是一个对话框。
- 另外还有一个属性:windowNoTitle这个属性一定要设置为false,不要标题栏。如果不设为false,当windowIsFloating属性为true时,运行会报错。
我做的一个Demo如下,layout就是一个EditText,两个Button,这里就不贴源码了,效果如下: