【发布时间】:2023-04-08 12:26:02
【问题描述】:
我目前正在为我的应用程序支持多种屏幕尺寸,并偶然发现了来自 google 的这个建议; https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#kotlin
它有这个代码;
private fun computeWindowSizeClasses() {
val metrics = WindowMetricsCalculator.getOrCreate()
.computeCurrentWindowMetrics(this)
val widthDp = metrics.bounds.width() /
resources.displayMetrics.density
val widthWindowSizeClass = when {
widthDp < 600f -> WindowSizeClass.COMPACT
widthDp < 840f -> WindowSizeClass.MEDIUM
else -> WindowSizeClass.EXPANDED
}
val heightDp = metrics.bounds.height() /
resources.displayMetrics.density
val heightWindowSizeClass = when {
heightDp < 480f -> WindowSizeClass.COMPACT
heightDp < 900f -> WindowSizeClass.MEDIUM
else -> WindowSizeClass.EXPANDED
}
// Use widthWindowSizeClass and heightWindowSizeClass
}
然后是项目内资源限定符,例如
/layout
/layout-w600dp
/layout-w840dp
当 Android 根据宽度选择布局时,它是否使用完全相同的计算方式?
widthDp = metrics.bounds.width() / resources.displayMetrics.density
不同的布局会有不同的元素。如何确保我的课程代码与 Android 选择的布局相同?
【问题讨论】:
-
一般情况下,您应该编写代码而不关心资源框架选择了哪种布局。相反,只需检查元素是否存在(即
findViewById()是否返回空值或非空值)。如果元素存在,请相应地更新它。如果没有,请不要担心;这只是平板电脑上的视图,不会显示在您用户的手机上。 -
您的建议是合理的。但是真的没有办法知道Android选择了哪种布局吗?我不会检查它,而是通过使用 findViewById() 来“伪造”它(自从切换到视图绑定后我就没怎么用过)。
-
不,它没有。不过谢谢。我的问题是如何在类代码中知道 Android 选择了哪个布局。我可以在每个布局版本中拥有一个独特的视图,然后将它们全部查找ViewById,直到我拥有一个......但是......肯定有更好的方法。