在 Android 12 设备上,可能会出现对话框被裁剪的问题。这是由于 Android 12 引入了一种新的 UI 渲染方式,称为“Splash Screen”,其中 UI 元素被分为三个层级:背景层、正文层和顶部层。当弹出对话框时,它被放置在正文层,但如果出现背景层或顶部层,对话框可能会被裁剪。
要解决这个问题,可以在弹出对话框之前,将当前屏幕截图保存到 Bitmap 中。然后,可以使用 DialogFragment 替换 Dialog,并将 Bitmap 作为背景显示在 DialogFragment 中。
下面是代码示例:
class MyDialogFragment : DialogFragment() {
private lateinit var rootView: View
private lateinit var screenShotBitmap: Bitmap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 获取屏幕截图
screenShotBitmap = getScreenShotBitmap(requireActivity())
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
rootView = inflater.inflate(R.layout.dialog_layout, container, false)
return rootView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 设置背景
rootView.background = BitmapDrawable(resources, screenShotBitmap)
}
/**
* 获取屏幕截图
*/
private fun getScreenShotBitmap(activity: Activity): Bitmap {
val decorView = activity.window.decorView
decorView.isDrawingCacheEnabled = true
decorView.buildDrawingCache()
val bitmap = Bitmap.createBitmap(decorView.drawingCache)
decorView.isDrawingCacheEnabled = false
return bitmap
}
}
使用 DialogFragment 弹出对话框:
val dialogFragment = MyDialogFragment()
dialogFragment.show