问题
很多时候,传统的Dialog并不能解决我们的问题,这个时候,我们就需要使用Activity来充当Dialog,以达到我们的目的。
普通的Activity配置Theme.AppCompat.Dialog 就长成这副德行。

在一些时候,是满足不了我们的需求的,比如我们在支付宝输入密码界面,我们需要支付页面是一个透明背景并且安全数字键盘是在底部,并且和左右两边没有留白,这个时候,我们就只能自定义主题了,我们在style中自定义一个透明的样式主题:
<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="windowNoTitle">true</item><!--没有标题 -->
<item name="windowActionBar">false</item><!--没有ActionBar -->
<item name="android:windowFullscreen">true</item><!--全屏 -->
<item name="android:windowIsFloating">true</item><!-- 浮动在activity之上,左右两边不会填充屏幕 -->
<item name="android:windowIsTranslucent">true</item><!-- 半透明 -->
<item name="android:windowFrame">@null</item><!--无边框 -->
<item name="android:backgroundDimEnabled">true</item><!-- 设置背景模糊-->
<item name="android:windowBackground">@android:color/transparent</item><!-- 设置背景模糊-->
</style>
这个时候你给Activity配置这个样式的主题,你会发现是这个鸟样。

what the fuck? 这是什么玩意?两边的留白实在是太丑了,如果密码键盘设置成这个吊样,用户肯定会分分钟卸载。那么问题到底出在哪里呢?其实主要问题是出在
<item name="android:windowIsFloating">true</item>
这一句配置上,这句配置的意思是,我们密码键盘的这个布局是浮动在当前Activity上的,以达到冒充Dialog以假乱真的效果,肯定有人会说,你把密码键盘的布局设置成match_parent不就可以了? 实际上我是已经设置成了match_parent。 如果我们将该属性改成false,大部分手机都是可以适配的,但是适配并不代表完美,比如说状态栏的时间不见了,这种小问题没什么大的影响,没有强迫症的可以忽略。(强迫症患者请看下面的解决办法和截图,我测试过4.x,5.x 以及 6.x,状态栏都是和下图一样的,完全达到了以假乱真的效果)只有少数手机是存在问题的,这少部分手机的问题主要表现为:
- 属性设置成false, 密码键盘布局会和后面的Activity布局重叠,看不出Dialog的效果
- 属性设置成true, 密码键盘的布局依然在左右两边有留白。(我当时就是出现了第二种情况,我在pos机上调试的,具体pos机是什么机型我也说不准)
解决办法
在onCreate方法中添加如下代码,在setContentView方法之后
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
完美解决!解决办法只是针对上面出现问题的少部分机型,如果没有上面的问题,就不要改了,毕竟手动更改布局参数这个方法很蠢。-v-

提示
这种底部弹出密码框的情景并不是说只有Dialog才能做,popWindow也是可以做的。不要拘泥于这一种方法。
当使用Theme.AppCompat.Dialog主题的Activity模仿Dialog时,可能会遇到无法全屏和两边留白的问题。通过自定义透明主题并调整布局参数,可以在大部分手机上实现全屏效果,但在某些机型上仍存在问题。解决方案是在onCreate方法中动态修改布局参数,以完美适配这些机型。
1万+

被折叠的 条评论
为什么被折叠?



