问题描述
我使用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
在两种情况下,它都会消除导航条的插入并显示切口区域,以得到相同的结果