Android 锁屏状态下Dialog不显示问题

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却可以正常的显示出来,通过对比发现后面的主题,比前面的主题多了windowMinWidthMajorwindowMinWidthMinor这两个属性。因此猜测可能是因为这两个属性引起的,通过实验发现确实是如此,给前面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、方法二

除了上面的方法,我们还可以通过添加windowMinWidthMajorwindowMinWidthMinor这两个属性来解决,从名字不难看出这两个属性表示的是窗口的最小宽度,只不过一个是主要的,一个是次要的,修正后的代码如下:

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

需要注意的是,windowMinWidthMajorwindowMinWidthMinor这两个属性的值不能设置为0,不然和没有设置的效果是一样的,同样会导致显示不出来。

通过使用上面的方法,就可以解决锁屏状态Dialog弹不出来的问题了。在此记录一下,希望对你们有所帮助!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android 中,可以通过创建一个透明的 Activity,将其设置为对话框样式,然后在该 Activity 中显示弹窗,从而在锁屏状态显示弹窗。 具体实现步骤如下: 1. 创建一个透明的 Activity,可以在 AndroidManifest.xml 中设置该 Activity 的主题为对话框样式: ``` <activity android:name=".MyDialogActivity" android:theme="@style/Theme.AppCompat.Dialog" /> ``` 2. 在 MyDialogActivity 中显示弹窗,可以使用 Dialog 或 PopupWindow 等控件。例如,使用 Dialog 控件可以在 onCreate 方法中添加以下代码: ``` Dialog dialog = new Dialog(this); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); dialog.setContentView(R.layout.my_dialog_layout); dialog.show(); ``` 3. 在弹窗显示之前,需要获取系统权限。在 Android 6.0 及以上版本中,需要动态申请 SYSTEM_ALERT_WINDOW 权限。可以在 MyDialogActivity 中添加以下代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE_OVERLAY_PERMISSION); } else { // 显示弹窗 } ``` 其中,REQUEST_CODE_OVERLAY_PERMISSION 是一个自定义的常量,用于在 onActivityResult 方法中处理权限请求结果。 4. 处理权限请求结果,在 MyDialogActivity 中添加 onActivityResult 方法: ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_OVERLAY_PERMISSION) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) { // 权限已授予,显示弹窗 } else { // 权限未授予,关闭 Activity finish(); } } } ``` 这样,在锁屏状态下,当应用需要显示弹窗时,可以启动 MyDialogActivity,从而在锁屏状态显示弹窗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值