强制设备从资源文件夹中获取资源

时间:2013-03-11 22:19:10

标签: android android-layout layout galaxy-tab

我知道这种行为不是预期的,也不是标准的,但我很清楚它是否可以实现。 谷歌也意识到普通大型xlarge方案并不是最好的方案,所以它已被推荐来自 Android 3.2。 (layout-swXXXdp对我来说是最好的选择)

但是,我必须支持3.2以下的设备,因为这个系统可能会出错。

主要问题:

Galaxy Note 1和Galaxy选项卡1(以及具有相同规格的其他设备)从同一layout-large文件夹中选择资源。但合理地说,我需要在7英寸和7英寸以上的屏幕下制作不同的布局。我知道我可以为“异常设备”创建一个单独的文件夹(比如layout {large-xhdpi-1280x800,如上所述here),但是我必须在不同的地方维护几个几乎(或完全相同)的xml文件文件夹只是因为这些设备。

因此,目标是仅为7英寸以下的设备维护一个xml包(文件夹),为7英寸以上的设备维护一个xml包(文件夹)。我知道有一些技巧,如:

  1. 以不同的方式命名xml-s(main.xml和main-large.xml),并在代码中决定选择哪个,但即使是设备也无法从代码中决定自己,它们究竟有多大(例如7英寸片剂可以从6.8到7.8英寸的比例回馈。此外,我想使用更多“androidy”方式与资源文件夹。
  2. 维护我提到的异常文件夹。 layoutlayout-largelayout-specifictags1layout-specifictags2,列表可以扩展。此外,specifictags1,tags2和normal具有完全相同的xml文件,但设备无需从layout-large中进行选择。完整的原因是要避免这种情况。
  3. EDIT )@Joe Malin提出了使用别名的想法。不幸的是,我无法在layout-large-xhdpi-1280x800中创建一个名为main.xml的别名,引用layout中的main.xml,因为它引用了self(然后是无限循环)。所以我必须在layout-large-xhdpi-1280x800中维护一个fakemain.xml,它引用只存在于layout中的main.xml。但是我还需要layout中的fakemain.xml,因为那时我不必关心代码中的布局,只使用伪别名作为别名。但是这个解决方案仍然 可以正常工作,但不幸的是,它在实践中不起作用。如果我在layoutlayout-largelayout-large-xhdpi-1280x800中有galaxy注释,那么别名指向layout-large,并且我没有通过使用别名获得任何结果
  4. 问题:

    layout-sw600dp概念将授予我最佳和所需的行为,但它在API级别13下不受支持。

    • 有没有办法强制设备从这个文件夹中选择,或者写一下它的变量(用java反射? - 我知道这很糟糕),表现得像普通的屏幕一样不大?
    • 有没有办法只维护两个xml包(文件夹):
      • 一个用于7英寸以下的设备,
      • 和一个用于7英寸以上的设备。

3 个答案:

答案 0 :(得分:1)

  

但是,我必须支持3.2以下的设备

不是很多。

  

有没有办法强制设备从这个文件夹中选择,或者写一下它的变量(用java反射? - 我知道这很糟糕),表现得像普通的屏幕一样不大?

没有。但是,您可以找到这些少数设备的型号,并选择为它们加载不同的布局(例如,R.layout.main正常,R.layout.you_are_worrying_about_this_way_too_much适用于少数型号的API级别13 7“平板电脑)。

  

有没有办法只维护两个xml包(文件夹):一个用于7英寸以下的设备,另一个用于7英寸以上的设备

为了安全起见,我会选择三个:

  • res/layout/低于-7“
  • res/layout-sw600dp/ 7“及以上
  • res/layout-xlarge/,可能使用res/layout-sw600dp/中的别名,少数XOOM,Tab 10.1,以及未升级到3.2的

答案 1 :(得分:1)

最后,我认为我得到了最好的解决方案。不知怎的,我没注意到,有两种类型的别名;那个@Joe Malin linkedthis type

第一种类型不是不幸的解决方案,但第二种类型正是我所寻找的,开发者页面描述了我需要的解决方案:

  

res / layout / main.xml:单窗格布局

     

res / layout-large:多窗格布局

     

布局res / layout-sw600dp:多窗格布局

     

最后两个文件是相同的,因为其中一个文件将与Android 3.2设备匹配,   而另一个是早先的平板电脑和电视的好处   Android版本。

     

为了避免重复平板电脑和电视的同一文件(和   由此导致的维护问题),您可以使用别名文件。

所以我需要在layout文件夹中使用其他名称在布局中制作布局差异;例如layout/mainnormal.xmllayout/mainlarge.xml。然后,我需要在不同的layout.xml文件夹中生成values,并按照上面link中的定义制作别名。

例如,我需要values/layout.xml一个values-large-xhdpi-1280x800/layout.xml(对于galaxy Note)values-large/layout.xml(对于较大的设备),也可能是layout-sw600dp/layout.xml

在前两个中,我需要为mainnormal.xml创建别名,为mainlarge.xml创建其他别名。这样我就不需要在代码中知道我正在使用哪种类型,只需使用id,例如R.layout.main

前两个案例中的

layout.xml

<resources>
    <item name="main" type="layout">@layout/mainnormal</item>
</resources>

在后一种情况下:

<resources>
    <item name="main" type="layout">@layout/mainlarge</item>
</resources>

答案 2 :(得分:0)

为别名资源提供帮助: Creating alias resources