使用自定义主题的Dialog样式Activity如何恢复周围半透明背景?
问题原因
android:backgroundDimAmount取值范围为0~1(0为完全透明,1为完全不透明),你设置为50超出合法范围,导致系统无法正确渲染半透明遮罩。- 你直接将
android:windowBackground设置为深灰色,覆盖了底层的半透明遮罩层。 - 之前添加的窗口透明代码没有配合布局背景设置,导致所有内容全部透明。
解决方案
步骤1:修改自定义主题
<style name="dialog_theme" parent="Theme.AppCompat.DayNight.Dialog"> <!-- 保留自定义文字颜色 --> <item name="android:textColor">@color/white</item> <!-- 窗口背景设为透明,让半透明遮罩正常显示 --> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:backgroundDimEnabled">true</item> <!-- 50%透明度的遮罩,取值0~1之间 --> <item name="android:backgroundDimAmount">0.5</item> <item name="android:windowIsFloating">true</item> </style>
步骤2:修改布局文件,给根布局添加自定义弹窗背景
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" <!-- 把你需要的深灰色弹窗背景设置在布局根节点 --> android:background="@color/dark_gray" <!-- 可选添加圆角和内边距,更接近原生对话框效果 --> android:padding="16dp" android:radius="8dp" tools:context=".activity.LockScreenActivity"> <!-- 原有TextView内容保持不变 --> <TextView android:id="@+id/textView2" android:layout_width="214dp" android:layout_height="136dp" android:gravity="center_vertical" android:padding="20dp" android:text="@string/aplicacao_bloqueada_text" android:textAlignment="viewStart" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.497" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
步骤3:删除冗余代码
删掉onCreate方法中添加的getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));代码,主题中已经配置了窗口透明,重复设置且没有配套布局背景会导致内容全透明。
修改完成后即可同时保留自定义的弹窗背景、文字颜色,以及系统原生Dialog的半透明遮罩效果。
内容的提问来源于stack exchange,提问作者Laila Campos
相关产品推荐
相关产品推荐

