WindowManager.getDefaultDisplay() 在 API 级别 30 中已被弃用,取而代之的是需要最低 API 级别 30 的 Context.getDisplay() 方法。
目前,androidx.core.content.ContextCompat 似乎没有提供任何向后兼容的getDisplay() 方法。
如果您只需要检索默认显示,而不是像其他答案建议的那样对不同的 API 级别使用不同的方法,您可以使用 DisplayManager.getDisplay(Display.DEFAULT_DISPLAY) 方法(自 API 17 起支持)来实现相同的结果。
不推荐使用的代码:
val defaultDisplay = getSystemService<WindowManager>()?.defaultDisplay
新代码:
val defaultDisplay = getSystemService<DisplayManager>()?.getDisplay(Display.DEFAULT_DISPLAY)
参考:androidx.core source code
如果您需要获取窗口的大小,新的Jetpack WindowManager library 为新旧平台版本中的新窗口管理器功能(例如可折叠设备和 Chrome 操作系统)提供了一个通用 API 界面。
dependencies {
implementation "androidx.window:window:1.0.0-beta02"
}
Jetpack WindowManager 提供两种方法来检索WindowMetrics 信息,作为异步流或同步。
异步 WindowMetrics 流:
当窗口大小发生变化时,使用WindowInfoRepository#currentWindowMetrics 获得库的通知,与此更改是否会触发配置更改无关。
import androidx.window.layout.WindowInfoRepository
import androidx.window.layout.WindowInfoRepository.Companion.windowInfoRepository
import androidx.window.layout.WindowMetrics
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.flowWithLifecycle
lifecycleScope.launch(Dispatchers.Main) {
windowInfoRepository().currentWindowMetrics.flowWithLifecycle(lifecycle)
.collect { windowMetrics: WindowMetrics ->
val currentBounds = windowMetrics.bounds // E.g. [0 0 1350 1800]
val width = currentBounds.width()
val height = currentBounds.height()
}
}
同步 WindowMetrics:
在异步 API 难以处理的视图中编写代码时使用WindowMetricsCalculator(例如onMeasure 或在测试期间)。
import androidx.window.layout.WindowMetricsCalculator
import androidx.window.layout.WindowMetrics
val windowMetrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(activity)
val currentBounds = windowMetrics.bounds // E.g. [0 0 1350 1800]
val width = currentBounds.width()
val height = currentBounds.height()
参考:Unbundling the WindowManager | Android Developers Medium