Android资源选择布局-和值-不一致
我遇到的问题表明,为给定活动的Android资源选择布局-和值-不一致,android,android-layout,android-resources,android-screen-support,Android,Android Layout,Android Resources,Android Screen Support,我遇到的问题表明,为给定活动的布局XML选择的资源桶与从值文件夹中选择的资源不一致,尽管在每组文件夹中使用了完全相同的资源限定符 例子 在应用程序的抽象父活动中放置一些日志代码后,我可以看到,当通过Nexus 7类型的仿真器(Android 4.1)启动应用程序时,最小宽度实际上是600dp,layout-sw600dp-*文件夹用于获取活动的UI,但用于值的文件夹是值大-*。我希望这是values-sw600dp-*,从而为我提供了有关活动在哪个资源桶下运行的重要信息 代码在我的应用程序的父活
布局
XML选择的资源桶与从值
文件夹中选择的资源不一致,尽管在每组文件夹中使用了完全相同的资源限定符
例子
在应用程序的抽象父活动中放置一些日志代码后,我可以看到,当通过Nexus 7类型的仿真器(Android 4.1)启动应用程序时,最小宽度实际上是600dp,layout-sw600dp-*
文件夹用于获取活动的UI,但用于值的文件夹是值大-*
。我希望这是values-sw600dp-*
,从而为我提供了有关活动在哪个资源桶下运行的重要信息
代码在我的应用程序的父活动中为所有android.app.activity
s执行日志记录
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()));
...
在Nexus7类型的设备上运行此代码时记录的输出
[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-*
文件夹下,我定义了一个名为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
的字符串。这里的目标是让我的代码与屏幕上显示的资源布局保持同步。这是必需的,这样我的代码就不会因为涉及不动产而“按id查找”显示布局中不存在的某个项目
(可选)我为什么这样做的更深层次的原因
想要知道运行时使用的bucket的更深层次的原因是,我意识到,我所有配置的单个片段代码越来越难以使用各种基于开关的逻辑进行管理,这些逻辑是不透明的,并且经常从其他布局复制功能……这就好像我需要某种类型的……这是如果你遵循链接,这正是我所做的。这样做的缺点是,在指示框架实例化x、y或z片段之前,我需要知道正在使用的屏幕,因为创建的片段永远不会与要膨胀的布局不同步。这种继承有效,并允许更易于管理的碎片堆栈(Sonar也更快乐,这很好)
总结
然而,框架选择的布局文件夹和值文件夹之间的明显差异阻碍了我的工作。每个都有相同的限定符,因此为什么利用layout-sw600dp-land
UI-XML的活动不使用values-sw600dp-land
资源?我希望我搞错了,因为这是我在上面链接的SO讨论中发布的最整洁的潜在解决方案。我确信您正在处理用于选择的资源优先级
如果您提供文件夹:
layout-sw600dp-*
values-large-*
values-sw600dp-*
Android并没有义务将“值选择”文件夹与“布局”文件夹的值匹配,相反,它分别对“布局”和“值”文件夹使用相同的优先级逻辑
您可以在此处了解此选择算法:
我正在为android 4.0.3开发一个应用程序。
如果使用sw600dp、sw720dp,则有必要使用下一个?:
-值-sw600dp-端口
default config.xml
-values-sw600dp-land
default config.xml
-值-sw700dp-端口
default config.xml
-values-sw700dp-land
default-config.xml
因为我没有使用res/values XXX,它看起来很好。给每个版面的父级GroupView
一个唯一的ID,这样你就可以知道这里使用的是哪个版面了。嗨@wingman-谢谢你的评论。事实上,如果我不明白这里发生了什么,我将使用格雷厄姆·博德兰的建议。你知道Android的资源派生在这个实例中是如何工作的吗?在遵循决策引擎逻辑之后,我们应该是金色的……感谢您的回答。事实上,我已经阅读了开发人员指南的这一部分,并试图更改选择以查看发生了什么。我同意你的观点,文档中没有任何内容表明值-
和布局-
资源选择逻辑必须相同。可惜不是。也许这就是所有这些的失败。再次感谢你的回答。如果没有更确切的证据,我一定会在悬赏结束前把货物分发出去。:)嗨,老鼠。谢谢你的回答。正如承诺的,赏金是你的。我将在Eclair之后获得android最佳匹配代码,并在测试用例中对正在发生的事情进行解构。当我找到确切的原因后,我会回到这里,让大众知道差异的细节。。。