API级别30中不推荐使用getSize

问题描述

我使用getSize()方法获取屏幕尺寸:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val fragmentActivity = requireActivity()
    ...
    val wm = fragmentActivity.getSystemService(Context.WINDOW_SERVICE) as WindowManager 
    val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        fragmentActivity.display
    } else {
        wm.defaultDisplay 
    }
    val size = Point()
    display?.getSize(size)
    
    // get screen sizes
    val width = size.x
    val height = size.y
    ...
}

但是使用API​​级别30时,方法getSize()被声明为已弃用。

什么可以代替getSize()获得屏幕尺寸?

感谢您的任何评论/答案!

解决方案

val wm = fragmentActivity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val width: Int
val height: Int
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val windowMetrics = wm.currentWindowMetrics
    val windowInsets: WindowInsets = windowMetrics.windowInsets

    val insets = windowInsets.getInsetsIgnoringVisibility(
          WindowInsets.Type.navigationBars() or WindowInsets.Type.displayCutout())
    val insetsWidth = insets.right + insets.left
    val insetsHeight = insets.top + insets.bottom

    val b = windowMetrics.bounds
    width = b.width() - insetsWidth
    height = b.height() - insetsHeight
} else {
    val size = Point()
    val display = wm.defaultDisplay // deprecated in API 30
    display?.getSize(size) // deprecated in API 30
    width = size.x
    height = size.y
}

解决方法

”使用WindowManager#getCurrentWindowMetrics()获取以下内容的实例 WindowMetrics,请改用WindowMetrics#getBounds()。“

它来自Android文档。你看了吗? [Android文档] https://developer.android.com/reference/android/view/Display#getSize(android.graphics.Point)

,

新的 Jetpack WindowManager library 为新旧平台版本中的新窗口管理器功能(例如可折叠设备)提供了一个通用 API 界面。

  • WindowManager.getCurrentWindowMetrics():根据当前系统状态返回WindowMetrics。这些指标描述了窗口将占据的区域大小,MATCH_PARENT 宽度和高度以及允许窗口延伸到显示切口后面的任何标志组合。
  • WindowManager.getMaximumWindowMetrics():返回应用在当前系统状态下可能期望的最大 WindowMetrics。这个值基于系统的最大潜在窗口状态。例如,对于多窗口模式下的 Activity,返回的指标基于用户展开窗口以覆盖整个屏幕时的边界。

示例代码 (ref):

dependencies {
    implementation "androidx.window:window:1.0.0-alpha07"
}

import androidx.window.WindowManager

val vm = WindowManager(context)
vm.currentWindowMetrics.bounds // E.g. [0 0 1350 1800]
vm.maximumWindowMetrics.bounds 
,

如果像我一样,您只想获取窗口大小,这是一个兼容版本:

1/0

在两种情况下,它都会消除导航条的插入并显示切口区域,以得到相同的结果

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...