2013-03-11 235 views
3

我知道这种行为不是预期的,也不是标准的,但我很好奇它是否可以实现。 谷歌也意识到,正常大xlarge计划不是最好的,所以它已从 Android 3.2弃用。 (布局swXXXdp将是我的最佳选择)强制设备从资源文件夹获取资源

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

主要问题:

的Galaxy Note 1和银河标签1(与同规格的其它设备)从同一个文件夹layout-large选择的资源。但合理的,我需要在7英寸以下和7英寸以上的屏幕上制作不同的布局。我知道我可以为“异常设备”创建一个单独的文件夹(如提到的here所示的layout-large-xhdpi-1280x800),但是之后我必须在不同文件夹中保留几个几乎(或确切)相同的xml文件,因为这些文件某些设备。

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

  1. 命名XML-S不同(main.xml中和主large.xml),并在代码选择决定,但即使设备不能决定他们自己从代码来看,它们究竟有多大(例如7英寸平板电脑可以从6.8到7.8英寸规模)。另外,我想用资源文件夹更“androidy”的方式。
  2. 正如我所提到的那样维护异常文件夹。 layout,layout-large,layout-specifictags1,layout-specifictags2并且该列表可以扩大。另外,specifictags1,tags2和normal具有完全相同的xml文件,但设备不需要从layout-large中进行选择。全部原因是为了避免这种情况。
  3. 编辑)使用别名的想法是由@Joe Malin提出的。不幸的是,我不能在layout-large-xhdpi-1280x800中创建一个名为main.xml的别名,它指向layout中的main.xml,因为它指的是自我然后(使无限循环)。所以我将不得不维护一个fakemain.xml在layout-large-xhdpi-1280x800引用main.xml只存在于layout。但是,我还需要在layout中使用fakemain.xml,因为那样我就不必关心代码中的布局,而只使用fakemain.xml这是一个别名。但这个解决方案仍然可能工作,但不实际工作,不幸。如果我在layout,layout-largelayout-large-xhdpi-1280x800中有一个用于银河注释的fakemain.xml,则该别名指向layout-large之一,而我通过使用该别名没有取得任何成效。

问:

布局sw600dp概念将给予我的最好的和必要的行为,但它不是在API级别13

  • 支持有没有办法强制设备从这个文件夹中选择,或写在它的变量(与Java反射? - 我知道这是非常糟糕的)行为像普通屏幕不大?
  • 是否有保持只有两个XML包(文件夹)的方式:
    • 一个用于下-7寸的设备,
    • 和一个用于上述的7英寸的设备。

回答

1

最后我得到了最好的解决方案,我想。不知何故,我没有注意到,有两种别名; @Joe Malin linkedthis type

第一类也不是办法不幸,但第二个正是我一直在寻找和开发者页面描述为我所需要的解决方案:

RES /布局/ main.xml中:单窗格布局

RES /布局大:多窗格布局

布局RES /布局sw600dp:多窗格布局

最后两个文件是相同的,因为一个他们将与Android 3.2设备匹配, ,另一款则为平板电脑和带早期版本Android的 版本的电视带来益处。

为了避免平板电脑和电视(和 从它产生的维护头痛)这种重复相同的文件,你可以使用别名文件。

所以我需要与layout文件夹内的其他名字布局的布局differencies;如layout/mainnormal.xmllayout/mainlarge.xml。然后,我需要在不同的values文件夹中创建layout.xml,并按上述link中的定义生成别名。

比如我需要一个values/layout.xml一个values-large-xhdpi-1280x800/layout.xml(银河注)一个values-large/layout.xml(较大的器件),也许也是一个layout-sw600dp/layout.xml

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

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

在后一种情况:

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

会做一个别名资源帮助: Creating alias resources

+0

不幸的是,我不能让一个别名命名xyz.xml在'布局大xhdpi-1280×800

前两个案件layout.xml ''在'layout'中引用了xyz.xml,因为它指的是自我(使无限循环)。我在编辑OP – abbath 2013-03-12 11:48:20

+0

中进一步解释了这一点。我发现了一个解决方案及其别名,但不是您链接的类型。 – abbath 2013-03-18 11:08:04

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/,为XOOMs的屈指可数,标签10.1的,并且使得没” t升级到3.2
+0

谢谢,这三个文件夹可以很好地工作。然后,我需要覆盖的唯一设备是7英寸未升级galaxytab1,这将有一个电话设计(这对我来说很好,但客户会以其他方式考虑)。 – abbath 2013-03-15 18:41:29

+0

但是,如果我决定在代码(测试英寸)选择哪种布局,我可以加载任何布局,并且不要让android选择。这是一个不好的选择吗?我觉得它不是太机械,但这样我就可以完全控制布局。 – abbath 2013-03-15 18:46:55

+0

@abbath:“这是不好的选择?” - 总的来说,是的,只是因为有*方式*太多的设备。即使您能够找到所有这些设备的详细信息,拥有千条“switch”声明也将无法维护。为了得出一个类比:用户代理在Web应用程序中嗅探以提供IE6的解决方法是合理的。说你会尝试为每个平台的每个浏览器编制目录,试图让你自己将浏览器映射到目标Web内容,通常不会这样做。 – CommonsWare 2013-03-15 19:13:24