【问题标题】:Force device to get resources from a resource folder强制设备从资源文件夹中获取资源
【发布时间】:2013-03-11 22:19:10
【问题描述】:

我知道这种行为既不是预期的也不是标准的,但我很好奇它是否可以实现。 Google 还意识到 normal-large-xlarge 方案不是最好的方案,因此 Android 3.2 弃用了它。 (layout-swXXXdp 对我来说是最好的选择)

但是,我必须支持 3.2 下的设备,并且可能会因为这个系统而行为不端。

主要问题:

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

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

  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,因为这样我就不必关心代码中的布局,而只使用作为别名的 fakemain.xml。然而这个解决方案仍然可以工作,但不幸的是在实践中不起作用。如果我在 layoutlayout-largelayout-large-xhdpi-1280x800 中有一个 fakemain.xml 用于 Galaxy Note,那么别名指向 layout-large 之一,而我使用别名却一无所获。

问题:

layout-sw600dp 概念会给我最好的和需要的行为,但它在 API 级别 13 下不受支持。

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

【问题讨论】:

    标签: android android-layout layout galaxy-tab


    【解决方案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 的文件

    【讨论】:

    • 谢谢,这三个文件夹可以很好地工作。然后我需要覆盖的唯一设备是 7inch-not-upgraded-galaxytab1,它将具有这样的手机设计(这对我来说很好,但客户会认为其他方式)。
    • 但是,如果我在代码中决定(通过测试英寸)选择哪种布局,我可以加载任何布局,并且不要让 android 选择。这是一个糟糕的选择吗?我觉得它不是太 androidy,但这样我可以完全控制布局。
    • @abbath:“这是一个糟糕的选择吗?” -- 总的来说,是的,只是因为方式的设备太多了。拥有一千个条目的switch 语句,即使您可以找到所有这些设备的详细信息,也将无法维护。打个比方:在 Web 应用程序中进行用户代理嗅探以提供解决方法,例如 IE6,是合理的。说您将尝试为每个平台对每个浏览器的每个版本进行分类,尝试将您自己的浏览器映射到目标 Web 内容,这通常是不可行的。
    • 不,我以为我只会检查设备的尺寸,并检查它是否低于或高于 7 英寸。这不是一千个条目switch 只是我必须在加载 xml 之前检查的两种情况。这合理吗?
    • @abbath:只要您对计算的可靠性感到满意。
    【解决方案2】:

    我想,我终于找到了最好的解决方案。不知何故,我没有注意到,有两种类型的别名; @Joe Malin linkedthis type 的那个。

    不幸的是,第一种不是解决方案,但第二种正是我正在寻找的,开发人员页面根据我的需要描述了解决方案:

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

    res/layout-large:多窗格布局

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

    最后两个文件完全相同,因为其中一个会被 Android 3.2 设备匹配, 另一个是为了平板电脑和电视的好处 Android 版本。

    为避免平板电脑和电视(以及 造成的维护头痛),您可以使用别名文件。

    所以我需要在 layout 文件夹中使用其他名称在布局中创建布局差异;比如layout/mainnormal.xmllayout/mainlarge.xml。然后我需要在不同的values文件夹中制作layout.xml,并按照上面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>
    

    【讨论】:

      【解决方案3】:

      制作别名资源有助于: Creating alias resources?

      【讨论】:

      • 不幸的是,我无法在 layout-large-xhdpi-1280x800 中创建一个名为 xyz.xml 的别名,该别名在 layout 中引用 xyz.xml,因为它引用了 self(造成无限循环)。我在 OP 的编辑中进一步解释了这一点
      • 我找到了一个解决方案及其别名,但不是您链接的类型。
      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2019-03-24
      • 2017-03-23
      • 2020-06-22
      • 2015-01-12
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多