我知道这种行为是不期望的,也不是标准的,但我很好奇它是否可以实现。Google也意识到normal-large-xlarge模式并不是最好的,所以从Android 3.2的中弃用了。(layout-swXXXdp是我最好的选择)
然而,我必须支持3.2下的设备,并且可能因为这个系统而行为不正常。
主要问题
Galaxy Note 1和Galaxy tab 1(以及其他具有相同规格的设备)从同一个layout-large
文件夹中选择资源。但我需要在7英寸以下和7英寸以上的屏幕上进行不同的布局。我知道我可以为"异常设备"(如这里提到的layout-large-xhdpi-1280x800)创建一个单独的文件夹,但这样我就必须在不同的文件夹中维护几个几乎(或完全)相同的xml文件,只是因为这些特定的设备。
因此,目标是为7英寸以下的设备只维护一个xml包(文件夹),为7英寸以上的设备维护一个xml包(文件夹)。我知道有一些技巧,比如:
- 以不同的方式命名xml-s (main.xml和main-large.xml),并在代码中决定选择哪个,但即使是设备也不能从代码中决定自己的大小,它们到底有多大(例如7英寸的平板电脑可以从6.8英寸返回到7.8英寸)。此外,我想使用更"安卓"的方式与资源文件夹。 如前所述,
- 维护异常文件夹。
layout
,layout-large
,layout-specifictags1
,layout-specifictags2
,列表可以扩大。另外,specifictags1、tags2和normal具有完全相同的xml文件,但需要设备不从layout-large
中选择。整个原因就是为了避免这种情况。 - (EDIT)使用别名的想法是由@Joe Malin提出的。不幸的是,我不能在
layout-large-xhdpi-1280x800
中创建一个名为main.xml的别名,该别名指的是layout
中的main.xml,因为它指的是self然后(使无限循环)。因此,我必须在layout-large-xhdpi-1280x800
中维护一个fakremain .xml,该xml引用仅存在于layout
中的main.xml。但然后我还需要一个fakemain.xml在layout
,因为这样我就不必关心从代码布局,只使用fakemain.xml这是一个别名。然而,这个解决方案仍然可以工作,但不幸的是在实践中不起作用。如果我在layout
,layout-large
和layout-large-xhdpi-1280x800
中有一个fakremain .xml用于galaxy note,那么别名指向layout-large
,并且我通过使用别名没有取得任何成果。
问题:
layout-sw600dp概念会给我最好的和需要的行为,但它不支持API级别13。
- 有没有办法强制设备从这个文件夹中选择,或者写在它的变量(java反射)?-我知道这很糟糕)表现得像正常的屏幕不大?
- 是否有办法只维护两个xml包(文件夹):
- 一个用于7英寸以下设备,
- 和一个用于7英寸以上设备。
然而,在3.2下有一些设备我必须支持
不是很多。
是否有一种方法可以强制设备从这个文件夹中进行选择,或者重写其变量(使用java反射)?-我知道这很糟糕)表现得像正常的屏幕不大?
。然而,你可以找到那些少数设备的型号,并选择为它们加载不同的布局(例如,R.layout.main
通常,R.layout.you_are_worrying_about_this_way_too_much
用于pre-API Level 13 7"平板电脑的少数型号)。
是否有办法只维护两个XML包(文件夹):一个用于7英寸以下的设备,另一个用于7英寸以上的设备
为了安全起见,我会选三个:
-
res/layout/
-
res/layout-sw600dp/
for 7"及以上 -
res/layout-xlarge/
,可能使用res/layout-sw600dp/
中的别名,用于少数xoom, Tab 10.1's等没有升级到3.2
我认为最后我得到了最好的解决方案。不知何故,我没有注意到,有两种类型的别名;@Joe Malin链接的那个,还有这个。
不幸的是,第一种类型不是解决方案,但第二种正是我正在寻找的,开发人员页面描述了我需要的解决方案:
res/layout/main.xml: single-pane layout
res/layout-large: multi-pane layout
layout res/layout-sw600dp: multi-pane layout
最后两个文件是相同的,因为其中一个将被Android 3.2设备匹配,另一个是为平板电脑和电视带来的好处Android版本
为了避免在平板电脑和电视(和,您可以使用别名文件。
所以我需要使布局与layout
文件夹内的其他名称布局的差异;比如layout/mainnormal.xml
和layout/mainlarge.xml
。然后我需要在不同的values
文件夹中制作layout.xml
,并按照上面的链接定义别名。
例如,我需要一个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>
创建别名资源会有帮助吗?创建别名资源?