我知道这种行为不是预期的,也不是标准的,但我很清楚它是否可以实现。 谷歌也意识到普通大型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包(文件夹)。我知道有一些技巧,如:
layout
,layout-large
,layout-specifictags1
,layout-specifictags2
,列表可以扩展。此外,specifictags1,tags2和normal具有完全相同的xml文件,但设备无需从layout-large
中进行选择。完整的原因是要避免这种情况。layout-large-xhdpi-1280x800
中创建一个名为main.xml的别名,引用layout
中的main.xml,因为它引用了self(然后是无限循环)。所以我必须在layout-large-xhdpi-1280x800
中维护一个fakemain.xml,它引用只存在于layout
中的main.xml。但是我还需要layout
中的fakemain.xml,因为那时我不必关心代码中的布局,只使用伪别名作为别名。但是这个解决方案仍然 可以正常工作,但不幸的是,它在实践中不起作用。如果我在layout
,layout-large
和layout-large-xhdpi-1280x800
中有galaxy注释,那么别名指向layout-large
,并且我没有通过使用别名获得任何结果问题:
layout-sw600dp概念将授予我最佳和所需的行为,但它在API级别13下不受支持。
答案 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 linked和this type。
第一种类型不是不幸的解决方案,但第二种类型正是我所寻找的,开发者页面描述了我需要的解决方案:
res / layout / main.xml:单窗格布局
res / layout-large:多窗格布局
布局res / layout-sw600dp:多窗格布局
最后两个文件是相同的,因为其中一个文件将与Android 3.2设备匹配, 而另一个是早先的平板电脑和电视的好处 Android版本。
为了避免重复平板电脑和电视的同一文件(和 由此导致的维护问题),您可以使用别名文件。
所以我需要在layout
文件夹中使用其他名称在布局中制作布局差异;例如layout/mainnormal.xml
和layout/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?