42

Nexus 7:7 英寸 1280x800

Galaxy Tab 10.1 10" 1280x800

我希望我的应用程序可以在 7 英寸和 10 英寸的平板电脑上运行。据我所知,我必须在我的应用程序中包含这些布局文件夹:

适用于 7 英寸平板电脑

  • 布局-sw600dp
  • 布局-sw600dp-端口

适用于 10 英寸平板电脑

  • 布局-sw720dp
  • 布局-sw720dp-端口

它在 nexus 7 上运行良好,但在 10" 平板电脑上加载了 sw600dp 布局。

如果我包括这些默认文件夹:

  • 布局
  • 布局端口

10" 银河选项卡从这些加载布局。

如果我只包括默认布局文件夹和 sw600dp 一个,它会在 nexus7 上崩溃。

如果 10 英寸 Galaxy 选项卡无法加载 sw720p 布局,我应该如何支持手机、7 英寸平板电脑和 10 英寸平板电脑?

编辑:格式化

4

4 回答 4

59

问题是,我没有默认布局文件夹。

我尝试过,只使用 sw600dp 和 sw720dp 文件夹。我仍然不知道他们为什么不工作,但我不在乎。无论如何,我不能使用 swxxxdp <3.2,所以搞砸了。

因此,如果您想编写一个必须支持手机(2.2+)、7 英寸平板电脑和 10 英寸平板电脑的应用程序,请使用以下老式的东西:

布局这是默认设置,即使您不打算支持手机也需要!

用于 7 英寸平板电脑的大布局(适用于模拟器和 nexus7)

layout-xlarge用于 10" 平板电脑(适用于模拟器和galaxytab10.1)

其他人也得出了同样的结论。

于 2013-02-27T13:56:40.420 回答
21

我在我的应用程序中也面临这样的问题。但我为此找到了一个很好的解决方案。我只有一种布局tablet,目录名称是layout-sw600dp. 现在,当部分涉及高度和宽度问题时,我创建了几个不同values的目录来放置dimensionsfont size其他存根。所以平板屏幕没有任何constant价值layout

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而不是使用layout-large-mdpiand进行不同的识别layout-large-ldpi,您不只是通过它来识别smallest width吗?因为,androiddrawables为不同的图像提供目录,唯一的就是它的分辨率。你有上述解决方案。

编辑

然后你必须开发不同的布局。没有其他选择。我在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)
于 2013-02-26T14:11:27.620 回答
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 操作系统,您仍然需要大的 xlarge。

关于 dpi 的使用,请注意,如果您只为尺寸设置一个密度限定符,layout-large-mdpi例如,匹配大限定符的任何设备都将使用此处的布局而不是另一个文件夹,这是由于最佳匹配标准,你可以在这里阅读。它会在匹配密度之前将其作为大型设备匹配,因此非 mdpi 密度屏幕仍将使用这些布局。

为了解决这个问题,您还必须包含您支持的任何其他密度的文件夹,因此layout-large-hdpi从上面的示例开始,并在此文件夹中包含您在 mdpi 文件夹中使用过的布局的 hdpi 版本(如果您需要它们)不同的。

当然也避免重复你的布局,如果你只需要它们,不要将与设备无关的布局复制到每个未使用的文件夹中res/layout,尝试只将需要这些限定符的布局保留在文件夹中并正确组织它们,确保你的文件夹以正确的优先顺序使用限定符命名,以防止将错误的文件夹用于密度/大小组合。

于 2013-09-13T14:43:45.833 回答
1

这很奇怪,因为您正在做正确的事情。

Nexus 7 应选择 sw600dp 限定符。
如果可用,Galaxy Tab 应选择 sw720dp 限定符。

您确定它在尝试找到合适的布局时会崩溃吗?Android 可能会找到正确的布局,但布局 xml 文件中的某些内容可能会丢失,从而导致崩溃。

于 2013-02-26T15:44:50.600 回答