Android资源select布局 – 和值 – 不一致

我遇到的问题表明,为给定活动的layout XMLselect的资源存储桶与从values文件夹中select的资源不一致,尽pipe在每组文件夹中使用完全相同的资源限定符。

在我的应用程序的抽象父活动中放置了一些日志代码之后,我可以看到,当通过Nexus 7types模拟器(Android 4.1)启动我的应用程序时,最小宽度确实是600dp, layout-sw600dp-*文件夹用于获取UI对于活动,但用于values的文件夹是values-large-* 。 我期待这是values-sw600dp-*因此提供了关于什么资源桶活动正在运行的重要信息。

代码在我的应用程序的所有android.app.Activity的父活动内进行日志logging

  protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Configuration config = getResources().getConfiguration(); Log.i(this.getClass().getSimpleName(), String.format("Smallest width is [%s]", config.smallestScreenWidthDp)); configurationContext = SupportedDeviceConfiguration.fromResourceQualifer(getString(string.resourceQualifier)); Log.i(this.getClass().getSimpleName(), String.format("Running under the [%s] configuration context.", configurationContext.getResourceQualifier())); ... 

logging在Nexus 7types设备上运行此代码时的输出;

 [Logging fluff] Smallest width is [600] [Logging fluff] Running under the [layout-large-land] configuration context. 

我知道你在想什么 – 这个布局是从哪里来的? 继续阅读…

背景

我正在试用这里概述的方法,这将允许我在运行时检查正在使用的资源桶。 本质上,我实现的方法具有以下资源限定符的结构;

 - res + layout // Default portrait layout. + layout-land // Default landscape layout + layout-large-land // pre 3.2 phablet landscape layout (Galaxy Note at v2.3.3) + layout-xlarge-land // pre 3.2 tablet landscape layout + layout-xlarge-port // pre 3.2 tablet portrait layout + layout-sw520dp-port // post 3.1 phablet portrait layout (Galaxy Note at v4.0.3) + layout-sw520dp-land // post 3.1 phablet landscape layout + layout-sw600dp-port // post 3.1 mini-tablet portrait layout (Nexus 7) + layout-sw600dp-land // post 3.1 mini-tablet-landscape layout + layout-sw700dp-port // post 3.1 tablet portrait layout + layout-sw700dp-land // post 3.1 tablet landscape layout - values // Contains the root strings.xml strings.xml - values-land default-config.xml - values-large-land default-config.xml - values-xlarge-land default-config.xml - values-xlarge-port default-config.xml - values-sw520dp-port default-config.xml - values-sw520dp-land default-config.xml - values-sw600dp-port default-config.xml - values-sw600dp-land default-config.xml - values-sw700dp-port default-config.xml - values-sw700dp-land default-config.xml 

所以基本上,这些values限定符反映了layout限定符的限定符。 在每个values-*文件夹下,我已经定义了一个名为device-config.xml XML文件。

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="resourceQualifier">layout-{qualifier of values folder}</string> </resources> 

因此,例如values-sw600dp-land文件夹的device-config.xml包含值为layout-sw600dp-land的单个string。 这里的目标是让我的代码与屏幕上显示的资源布局保持同步。 这是需要的,以便我的代码不会因为涉及到房地产而使得“通过ID查找”某个项目在显示的布局上不存在。

(可选)深入推理,为什么我这样做

想知道在运行时使用的存储桶的更深层次的原因是因为我认识到,我的单片段全部configuration代码变得难以用各种基于开关的逻辑来pipe理,这些逻辑不透明,其他布局……就好像我需要某种片段inheritance ……如果你按照链接的话就是我所做的。 这样做的缺点是,我需要知道我正在使用哪个屏幕,然后指示框架实例化x,y或z片段,在创build片段永远不会与布局不同步的情况下是为了膨胀。 这种inheritance的作品,并允许一个更易于pipe理的片段堆栈(Sonar更快乐,这是很好的)。

概要

然而,我被框架select的布局文件夹和值文件夹之间的明显差异阻碍了。 每个都具有相同的限定符,因此为什么没有使用layout-sw600dp-land UI XML的活动使用values-sw600dp-land资源? 我希望自己有什么错,因为这是我在上面链接到的SO讨论上发布的最有潜力的解决scheme。

Solutions Collecting From Web of "Android资源select布局 – 和值 – 不一致"

我确定你正在处理用于select的资源优先级。

如果您提供文件夹:

 layout-sw600dp-* values-large-* values-sw600dp-* 

Android没有义务将select文件夹与布局 相匹配,而是分别对布局和值文件夹分别使用相同的优先级逻辑。

你可以在这里了解这个selectalgorithm: http : //developer.android.com/guide/topics/resources/providing-resources.html#BestMatch

我正在为Android 4.0.3做一个应用程序。 如果使用sw600dp,sw720dp,那么使用下一个?: – values-sw600dp-port default-config.xml
– values-sw600dp-land default-config.xml
– 值-sw700dp-port default-config.xml
值-sw700dp土地默认configuration文件,因为我没有使用res / values-XXX,它似乎工作正常。