如何正确包含 10" 和 7" 布局

Posted

技术标签:

【中文标题】如何正确包含 10" 和 7" 布局【英文标题】:How to include 10" and 7" layouts properly 【发布时间】:2013-02-12 00:00:43 【问题描述】:

Nexus 7:7 英寸 1280x800

Galaxy tab 10.1 10" 1280x800

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

适用于 7 英寸平板电脑

layout-sw600dp layout-sw600dp-port

适用于 10 英寸平板电脑

布局-sw720dp layout-sw720dp-port

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

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

布局 布局端口

10" 星系标签从这些加载布局。

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

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

编辑:格式化

【问题讨论】:

你的api级别>13(版本>3.2)? galaxy 选项卡是 api 级别 15 (4.0.4)。我的最低 api 级别应该是 8... 【参考方案1】:

我的应用程序也面临这样的问题。但我为此找到了一个很好的解决方案。 我只有tablet 的一种布局,目录名称是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。而不是使用layout-large-mdpilayout-large-ldpi 进行不同的识别,您不只是通过它的smallest width 识别吗?因为,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" 布局完全不同。【参考方案2】:

这很奇怪,因为你做的是正确的事情。

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

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

【讨论】:

它在 setContentView 处崩溃。这是另一个示例:ainol venus 7" 1280x800 160dpi 不会加载 sw600dp 布局。 我测试了一遍又一遍。我的默认布局是 10" 的,它们位于 sw720dp 文件夹中,galaxy 选项卡加载 sw600dp 的 @berestom:仅供参考:ainol venus 有 sw480dp ,“正常”类别的屏幕(既不大也不特大)。 我使用了这个版本但不能正常工作,我不知道为什么,但似乎您的布局 sw600dp / sw720dp 在平板电脑景观中没有正确引用【参考方案3】:

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

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

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

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

layout-large 适用于 7 英寸平板电脑(适用于模拟器和 nexus7)

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

Other people也得出了同样的结论。

【讨论】:

我同意,我遇到了同样的问题,解决了添加 layout-xlarge 和 drawable-xlarge 文件夹的问题。 我同意你的看法。 sw600dp 不再是标准的实现方式。我实际上没有尝试过你的解决方案,但我想这是唯一的出路。寻找任何更好的方法。我发现有人会分享。 没错,sw600dp 对我不起作用。所以我使用了 layout-large 和 layout-xlarge。【参考方案4】:

是的,您应该使用与布局相关的文件夹,但还要确保任何与设备无关的布局都放在您的 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,那么任何匹配大限定符的设备都将使用此处的布局而不是另一个文件夹,这是由于最佳匹配标准,您可以阅读有关here 的信息。它会在匹配密度之前将其作为大型设备匹配,因此非 mdpi 密度屏幕仍将使用这些布局。

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

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

【讨论】:

不起作用。进进出出,四处寻找。其他人也有同样的问题。 sw600dp 只是不工作。对于我的一加一,它会拉出 sw600dp 文件夹布局。

以上是关于如何正确包含 10" 和 7" 布局的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Maven 项目中正确包含“org.apache.catalina.filters.SetCharacterEncodingFilter”过滤器?

如何判断一个数组中是不是包含一个字符或字符串

如何修复错误 ITMS-90680 StickerPackExtension.appex 未包含在正确命名的目录中。它应该在“插件”下

python2.7, 正则表达式 查找 同时包含 字母和数字 的单词

Angular node_modules:正确包含 JQuery 并防止“未定义窗口”错误

如何正确使用 Composer 安装 Laravel 扩展包