如何正确添加10英寸和7英寸的布局

42
Nexus 7: 7英寸1280x800
Galaxy tab 10.1 10英寸1280x800
我希望我的应用程序能在7英寸和10英寸平板电脑上运行。据我所知,我必须在我的应用程序中包含以下布局文件夹:
对于7英寸平板电脑 layout-sw600dp layout-sw600dp-port
对于10英寸平板电脑 layout-sw720dp layout-sw720dp-port
它在nexus 7上运行良好,但在10英寸平板电脑上加载sw600dp布局。
如果我只包括默认的文件夹: layout layout-port
10英寸galaxy tab会从这些中加载布局。
如果我只包括默认的布局文件夹和sw600dp文件夹,则在nexus7上崩溃。
如果10英寸galaxy tab无法加载sw720p布局,那么我应该如何支持手机、7英寸平板电脑和10英寸平板电脑呢?
编辑:格式化

3
您的 API 级别是否大于 13(即版本是否大于 3.2)? - Padma Kumar
Galaxy Tab的API级别是15(4.0.4)。我的最低API级别应该是8... - berestom
4个回答

59
问题是,我没有默认的布局文件夹。
我尝试使用只有sw600dp和sw720dp文件夹来运行。我仍然不知道为什么它们不起作用,但我不在乎。我无法使用swxxxdp <3.2,所以忘了它吧。
所以,如果你想编写一个支持手机(2.2+)、7英寸平板电脑和10英寸平板电脑的应用程序,请使用以下老式的东西: layout 这是默认的,即使你不打算支持手机也需要它! layout-large 适用于7英寸平板电脑(在模拟器和nexus7上工作) layout-xlarge 适用于10英寸平板电脑(在模拟器和galaxytab10.1上工作) 其他人也得出了同样的结论。

1
我同意,我也遇到了同样的问题,通过添加layout-xlarge和drawable-xlarge文件夹解决了。 - Muhammad Irfan
我同意你的观点。现在,sw600dp 不再是标准的实现方式。实际上,我还没有尝试过你的解决方案,但我猜这可能是唯一的出路。我正在寻找更好的方法。如果我找到了,我会分享的。 - Abhijit Gujar
准确地说,sw600dp 对我没有起作用。所以我使用了 layout-large 和 layout-xlarge。 - TharakaNirmana

21
我在我的应用程序中也遇到了这样的问题。但是我找到了一个很好的解决方案。 我只有一个适用于平板电脑的布局,目录名称为layout-sw600dp。 现在,当涉及高度和宽度问题时,我创建了几个不同的values目录,在其中放置了dimensionsfont size和其他存根。因此,在平板电脑屏幕的layout中将没有constant值。
androd:layout_width:"60dp" // i drop this scenario

androd:layout_width:"@dimen/tab_width" // i used this scenario

你的values目录名称将会是这样的

values-xlarge
values-large

所有的值都将从您的值目录中获取。它不会创建不同的布局,但一个布局可以被多次使用。
以下是来自Developer.android网站的话语。 配置示例
为了帮助您针对不同类型的设备定位一些设计,这里有一些典型屏幕宽度的数字:
320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
480dp: a tweener tablet like the Streak (480x800 mdpi).
600dp: a 7” tablet (600x1024 mdpi).
720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).

使用表2中的大小限定符,您的应用程序可以在手持设备和平板电脑之间使用任意数量的宽度和/或高度来切换不同的布局资源。例如,如果600dp是您的平板电脑布局支持的最小可用宽度,您可以提供这两组布局:

res/layout/main_activity.xml # 用于手持设备
res/layout-sw600dp/main_activity.xml # 用于平板电脑

===

在这里,您可以看到,1280*720的布局位于layout-sw720dp下,因此您应该使用此选项来决定差异,而不是创建layout-normal-xlarge。您难道不是通过其最小宽度来识别不同吗?因为,android提供了用于不同图像的drawables目录,唯一的区别是其分辨率。您已经有了以上的解决方案。 编辑 然后你必须开发不同的布局。没有其他选择。我在http://jamil.fluidsoul.net/2011/03/06/creating-android-applications-for-multiple-screen-sizes找到了相关信息。
Low density Small screens QVGA 240x320 (120dpi):

layout-small-ldpi (240x320)  
layout-small-land-ldpi (320x240)

Low density Normal screens WVGA400 240x400 (x432) (120dpi):

layout-ldpi  (240 x 400 )
layout-land-ldpi  (400 x 240 )

Medium density Normal screens HVGA 320x480 (160dpi):

layout-mdpi (320 x 480 )
layout-land-mdpi (480 x 320 )

Medium density Large screens HVGA 320x480 (160dpi):

layout-large-mdpi (320 x 480 )
layout-large-land-mdpi (480 x 320)

Galaxy Tab ( 240 dpi ):

layout-large  (600 x 1024) 
layout-large-land  (1024 x 600)

High density Normal screens WVGA800 480x800 (x854) (240 dpi):

layout-hdpi (480 x 800)
layout-land-hdpi (800 x 480)

Xoom (medium density large but 1280x800 res) (160 dpi):

layout-xlarge (800 x 1280)
layout-xlarge-land (1280 x 800)

我的问题是,我的7英寸和10英寸的布局完全不同。 - berestom

2
是的,你应该使用与布局相关的文件夹,但也要确保任何设备独立的布局放在res/layout文件夹中。
这在Android开发者网站上已经提到,但为了重申他们的观点,如果你有一个仅在layout-xlarge文件夹中可用的布局,而该应用程序还支持大型和普通大小的设备,那么较小的设备将无法找到此资源的匹配项,导致应用程序崩溃。
这是一个很好的文件夹结构,从以下位置开始:
res/layout

保持设备无关的布局,如果您考虑到了每种可能的限定符类型,就可以避免这种情况,但这仍然是更安全的选项。
如果您想为7英寸和10英寸平板电脑添加特定的布局,请使用以下所有内容:
res/layout-large
res/layout-xlarge
res/layout-sw600dp
res/layout-sw720dp
res/layout-sw800dp

针对您想要支持的任何特定设备屏幕宽度,都可以这样做。需要注意的是,sw600支持最小可能的宽度,因此在设备横向持有时避免使用屏幕宽度。使用swxxxdp限定符是首选,但这些是在API 13中添加的,因此您仍然需要为旧版Android OS使用large、xlarge。
关于dpi的使用,请注意,如果您仅为一个尺寸设置了一个密度限定符,例如layout-large-mdpi,那么与大型限定符匹配的任何设备都将使用此处的布局,而不是其他文件夹中的布局,这是由于最佳匹配标准引起的,您可以在这里阅读有关此标准的内容。它将把它匹配为大型设备,然后才会匹配密度,因此非mdpi密度屏幕仍将使用这些布局。
为了解决这个问题,您还需要包括您支持的任何其他密度的文件夹,例如上面的示例中的layout-large-hdpi,并在这个文件夹中包含mdpi文件夹中使用过的布局的hdpi版本(如果需要它们不同)。
避免重复布局,当然也不要将设备无关的布局复制到每个未使用的文件夹中,如果您只需要它们在res/layout中,请尝试仅保留需要这些限定符的布局,并正确组织它们,确保您的文件夹按优先顺序命名限定符,以防止使用错误的文件夹来处理密度/大小组合。

不起作用。已经进出并搜索了所有地方。还有其他人遇到了同样的问题。sw600dp就是不起作用。对于我的一加一手机,它会拉取sw600dp文件夹布局。 - Abhijit Gujar

1
这很奇怪,因为你正在做正确的事情。
Nexus 7应选择sw600dp限定符。
如果可用,则Galaxy Tab应选择sw720dp限定符。
你确定它在尝试查找适当的布局时崩溃吗?Android可能会找到正确的布局,但布局xml文件中可能缺少某些内容,导致崩溃。

它在setContentView处崩溃了。这里有另一个例子:ainol venus 7英寸1280x800 160dpi无法加载sw600dp布局。 - berestom
我已经反复测试过了。我的默认布局将是10英寸的,它们在sw720dp文件夹中,而Galaxy Tab则加载sw600dp的布局。 - berestom
@berestom:仅供参考:Ainol Venus具有sw480dp,属于“正常”类别的屏幕(既不大也不超大)。 - Sergey Vakulenko
我使用了这些版本,但是它们没有正确地工作,我不知道为什么,但似乎你的布局sw600dp / sw720dp在平板电脑横向模式下没有被正确引用。 - user3402040

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接