【问题标题】:Resource Qualifiers - determine currently selected programatically?资源限定符 - 以编程方式确定当前选择?
【发布时间】: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,直到我拥有一个......但是......肯定有更好的方法。

标签: android kotlin


【解决方案1】:

如果您真的需要知道,您可以为您支持的每个资​​源限定符提供一个 values 资源。例如,

值/whatever.xml:

<string name="resource_qualifier">default</string>

值-w600dp/whatever.xml:

<string name="resource_qualifier">w600dp</string>

然后你可以getString()这个资源值。

【讨论】:

  • 优雅,谢谢
  • 我找到了您可能感兴趣的更好答案; getResources().getConfiguration()
【解决方案2】:

我找到了更好的答案;

getResources().getConfiguration()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2011-06-14
    • 2010-09-07
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多