1、概述
大家都知道系统自带的Dialog真的是很丑,所以很多时候弹框我们都需要自定义。然而最近做项目的时候,发现在三星Android 9.0和部分android 8.0的手机上,在锁屏状态下弹出的自定义Dialog只有半透明背景,没有内容。对这个问题刚开始也是一脸茫然,不知道怎么解决,因为网上也没有类似的问题,最后只能慢慢的试,看看是哪儿出了问题,最后发现该问题是因为使用的主题引起的。所以记录一下,以免忘记!
2、问题代码
修改前使用的主题如下:
<style name="no_input_dialog" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowFrame">@android:color/transparent</item><!-- 边框 -->
<item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowBackground">@android:color/transparent</item><!-- 自己想要的背景 -->
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
</style>
其实@android:style/Theme.Holo.Light.Dialog
这个主题平时我们使用的还是比较多,以前一直没有发现会有这样的问题。除了@android:style/Theme.Holo.Light.Dialog
还有@android:style/Theme.Material.Dialog
、@style/Theme.AppCompat.Dialog
、@android:style/Theme.Material.Light.Dialog
、@style/Theme.AppCompat.Light.Dialog
、@android:style/Theme.Holo.Dialog
等等的主题都会出现这样的问题。而@android:style/Theme.Material.Dialog.Alert
、@style/Theme.AppCompat.Dialog.Alert
、@android:style/Theme.Material.Light.Dialog.Alert
、@style/Theme.AppCompat.Light.Dialog.Alert
却可以正常的显示出来,通过对比发现后面的主题,比前面的主题多了windowMinWidthMajor
、windowMinWidthMinor
这两个属性。因此猜测可能是因为这两个属性引起的,通过实验发现确实是如此,给前面6个主题添加上这两个属性之后就不会出现显示不出来的问题了。由此可见,是因为没有给Dialog设置最小的宽度,导致dialog在锁屏状态下显示不出来的。下面我们一起来看一看怎么解决。
3、解决办法
1、方法一
上面说了这个问题是由于没有设置最小宽度引起的,所以我们只需要将继承的主题修改为设置了这两个属性的主题即可。将@android:style/Theme.Holo.Light.Dialog
换成@android:style/Theme.Material.Dialog.Alert
、@style/Theme.AppCompat.Dialog.Alert
、@android:style/Theme.Material.Light.Dialog.Alert
、@style/Theme.AppCompat.Light.Dialog.Alert
其中之一即可。但是这几个主题里面给button设置了样式会导致你自定义的按钮有阴影边,因此需要覆盖button的样式,代码如下:
<style name="no_input_dialog" parent="@android:style/Theme.Material.Dialog.Alert">
<item name="android:windowFrame">@android:color/transparent</item><!-- 边框 -->
<item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowBackground">@android:color/transparent</item><!-- 自己想要的背景 -->
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
<item name="android:buttonStyle">@style/dialog_button_style</item>
</style>
<!-- 按钮主题 -->
<style name="dialog_button_style" parent="android:Widget">
<item name="android:background">@color/color_white</item>
<item name="android:textAppearance">?android:attr/textAppearanceButton</item>
<item name="android:minHeight">48dip</item>
<item name="android:minWidth">88dip</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:gravity">center_vertical|center_horizontal</item>
</style>
2、方法二
除了上面的方法,我们还可以通过添加windowMinWidthMajor
、windowMinWidthMinor
这两个属性来解决,从名字不难看出这两个属性表示的是窗口的最小宽度,只不过一个是主要的,一个是次要的,修正后的代码如下:
<style name="no_input_dialog" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:windowFrame">@android:color/transparent</item><!-- 边框 -->
<item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowBackground">@android:color/transparent</item><!-- 自己想要的背景 -->
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
<item name="android:windowMinWidthMajor">50%</item>
<item name="android:windowMinWidthMinor">50%</item>
</style>
需要注意的是,windowMinWidthMajor
、windowMinWidthMinor
这两个属性的值不能设置为0,不然和没有设置的效果是一样的,同样会导致显示不出来。
通过使用上面的方法,就可以解决锁屏状态Dialog弹不出来的问题了。在此记录一下,希望对你们有所帮助!