Android处理多个屏幕......(相对布局或线性布局)?

时间:2012-06-10 19:06:56

标签: android android-layout android-screen-support

我已经完成了我的应用程序,现在需要处理适应多种屏幕尺寸。

此时似乎我唯一的选择是执行以下操作:

具有单独的xml布局:Small,Normal,Large和X-Large屏幕尺寸。 在其中有一个单独的xml布局:ldpi,mdpi,hdpi和xhdpi 在肖像和风景中有一个单独的xml布局。

一项活动共有32个布局。

我只是想知道是否有更好的方法来执行此操作,因为这将非常耗时,但是如果需要支持所有可能的设备,我不会介意它。

我做了一些阅读,人们说使用线性布局并使用重力,因为它是一个百分比,所以它在所有屏幕上看起来都一样。或者我可以使用RelativeLayout并使用“AlignAbove或Below”等。

然而,我的主要问题是尺寸错误,而元素的位置似乎通常在正确的位置。

有没有被广泛接受的方法来做到这一点?

我真的只是在寻找普通开发人员处理所有屏幕尺寸的“主流”方式。

4 个答案:

答案 0 :(得分:15)

好问题。但是你这样做并不是一个" 专业"开发者会做的。 单个Activity不需要32个布局,Android足够智能处理事情。

  

没有layout.xml的多重定义/ dimens.xml的多重定义   是否可以提供多设备支持?

是的,这绝对是可能的,这就是你应该做的事情。为单个Activity布局定义32个布局并不是一件好事。

假设我在Play商店中有一个相当大的应用程序,有超过20个活动,现在如果我为一个Activity定义了32个布局,那么我的应用程序将有超过600个布局。 这可行吗?只要问问自己。

您需要先为 this页面提供非常好的阅读。它包含您需要知道的几乎所有内容。但我会帮助你把事情做好。

  

您无需为每种组合提供替代资源   屏幕尺寸和密度。该系统提供强大的兼容性   可以处理大部分渲染工作的功能   任何设备屏幕上的应用程序,只要您已实施   您的UI使用的技术可以优雅地调整大小

这句话足以让你相信你不应该这样做。 Android系统非常智能,可以相应地调整您的布局。相信我,它非常好。

  

在设计不同屏幕尺寸的用户界面时,您会发现这一点   每种设计都需要最小的空间。所以,每个都是概括的   上面的屏幕尺寸具有相关的最小分辨率   由系统。这些最小尺寸在" dp"单位 - 相同的单位   你应该在定义布局时使用

我将尝试指出您需要考虑的一些重要事项。

  • 永远不要硬编码布局中的像素
  • 始终在布局中使用dpsp。顾名思义,它们独立于不同设备的密度,因此在每个设备中看起来都相同。
  • 始终使用wrap_contentmatch_parent作为高度和宽度
  • 永远不要使用AbsoluteLayout
  • RelativeLayoutLinearLayout两者都适合您,您只需根据具体情况决定要使用哪一个
  • 始终为不同的屏幕尺寸提供不同版本的drawable 。这是你不能跳过的。如果你不这样做,不仅你的布局在不同的设备上看起来很糟糕,而且会让你的应用消耗不必要的资源。
  • 虽然单个版面也适用于平板电脑,但由于桌面的屏幕尺寸远大于典型手机的屏幕尺寸,您应该只为它们提供单独的版面。

Android Studio Rich Layout Editor

Android Studio有一个惊人的布局编辑器,您可以在其中立即预览布局。请看下面的截图,

enter image description here

我正在同时预览各种屏幕尺寸的应用程序的特定屏幕,我的布局看起来就像我希望它看起来一样

我只有两个布局用于此活动,一个用于所有手机,一个用于所有平板电脑。

实践经验

如果您需要实际体验,我会在Play商店中运行一个应用程序,该应用程序已被超过8000种不同屏幕尺寸的不同设备上的数千名用户使用。

我只有2个特定活动的布局,一个用于手机,一个用于平板电脑。我的应用程序的用户界面在所有设备上看起来都不错,我从来没有对任何用户提出任何投诉。如果您需要,here是该应用的链接。

我确信这个详细的答案可以澄清你所有的疑虑,如果没有,请不要犹豫,让我知道。我很想进一步帮助。

<强> UDPATE

我会再次尝试清除你的困惑。但首先,我会建议您不止一次阅读我的答案

您需要一个或两个布局,一切都取决于您正在设计的特定布局。所有布局都不同。 它无法在技术上被定义为主观。没有拇指规则。但我会尽力帮助你。

您需要充分利用 Android Studio Rich Layout Editor 及其出色的实时预览功能。

  • 首先尝试设计针对任何平均设备尺寸的布局(例如5英寸的Nexus 5)。只需选择Nexus 5即可预览您的布局。

  • 对设计感到满意后,请选择其他屏幕尺寸进行预览。您也可以选择&#34;预览所有尺寸&#34;就像上面的截图一样。

  • 尝试查看所有屏幕尺寸的布局是否都很好,从4英寸到10英寸的平板电脑不等。查看间距,图像大小,字体大小是否都正确。

  • 所有4英寸到6英寸的手机通常都会有完美的预览,但您可能需要为平板电脑屏幕分别设计另一种布局(因为它们足够大)。只有这里需要2个布局,但并非总是如此。

就像我的应用程序一样,我有2个独立的布局,仅用于5-6个活动,但其余的我只有一个布局。这一切都取决于具体的布局。

设计与编程完全不同。 编程可以正式和语法定义,但设计不能。设计绝对是主观的,取决于设计师的观点。 以自己的方式发挥创造力,这是设计的魔力

答案 1 :(得分:3)

  

然而,我的主要问题是尺寸错误,而元素的位置似乎通常在正确的位置。

您是否正确使用dp和sp单位?

  

DP

  密度无关像素 - 基于屏幕物理密度的抽象单位。这些单位相对于160 dpi   (每英寸点数)屏幕,1dp大致等于1px。什么时候   在更高密度的屏幕上运行,用于绘制的像素数   1dp按照适合屏幕dpi的系数放大。   同样,在较低密度屏幕上时,使用的像素数   对于1dp按比例缩小。 dp与像素的比率将随之变化   屏幕密度,但不一定是正比例。使用dp   单位(而不是px单位)是制作视图的简单解决方案   布局中的尺寸可以针对不同的屏幕正确调整大小   密度。换句话说,它为现实世界提供了一致性   不同设备上UI元素的大小。

  SP

      与比例无关的像素 - 这与dp单位类似,但它也可以通过用户的字体大小首选项进行缩放。推荐你   指定字体大小时使用此单位,因此将调整它们   屏幕密度和用户偏好。

来自android documentmention。

答案 2 :(得分:1)

我认为阅读文档很好,他们已经解释了support multiple screen的每一件事。

但是每个人都混淆 HOW WHEN 我们必须使用它,对吗?

在混淆之前只需下载iosched等官方示例代码,尝试了解他们如何管理支持屏幕 -

  

第一次很难理解代码,但我们是   开发商所以......

示例:我有一个支持API 10-22的Android,所有设备都从(Galaxy star s5280-非常小的屏幕)到10英寸平板电脑(Nexus 10)开始。

如何管理资源,

POINT-1 以布局

开头

创建两个布局,如下面的

res/layout/my_layout.xml   
res/layout-sw600dp/my_layout.xml // 7 inch tablets

下面是可选,以防您需要非常小或大的布局

res/layout-small/my_layout.xml
res/layout-sw720dp/my_layout.xml // 10 inch tablets

POINT-2 您还可以使用维度

管理布局
res/values/dimens.xml
res/values-sw600dp/dimens.xml // 7 inch tablets
res/values-sw720dp/dimens.xml // 10 inch tablets

POINT-3 添加不同的drawable

res/drawable-mdpi/graphic.png 
res/drawable-hdpi/graphic.png 
res/drawable-xhdpi/graphic.png 
res/drawable-xxhdpi/graphic.png 

根据我的经验,每个人都使用POINT 1&amp; amp; 2(根据要求)和POINT-3是通用的:)。阅读Best Practices

最后请勿忘记在Android清单文件中使用<supports-screens><compatible-screens>

编辑:

  

我可以使用值 - 大&amp;价值观XLARGE?我很困惑   价值观 - 大&amp;值-sw600dp

注意:从Android 3.2(API级别13)开始,不推荐使用这些尺寸组,而采用了一种基于可用屏幕宽度管理屏幕尺寸的新技术。如果您要针对Android 3.2及更高版本进行开发,请参阅Declaring Tablet Layouts for Android 3.2以获取更多信息。

首先阅读上面的指南,根据他们,我们不必使用such as large or xlarge只使用600dp of width。这是为&gt; = 3.2 android os。它可以在每台设备上运行,但是你可能会在GALAXY系列设备中遇到问题,例如GALAXY TAB-2,GRAND,因为它们有旧的API,你可以使用值 - 大和&amp;价值观XLARGE。这是特定于设备的问题仅在需要时执行。

还有一个注意事项,根据需要创建上面的布局多个文件,就像我们在布局中有listview然后创建一个文件一样,所有设备都包含平板电脑,这样你也可以管理你的应用尺寸。

LINEAR,RELATIVE和FRAME布局让您的生活更轻松。

答案 3 :(得分:0)

你可以通过动态设计布局来实现这一点。它可以适用于所有的屏幕。在Android中我们无法在可用的移动屏幕上得出结论。有很多不同分辨率的屏幕。为了使UI具有灵活性你需要动态设计一个布局。 例如,我添加了一个可以修复所有屏幕的xml(纵向)。

xml是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="10"
android:gravity="center">


<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="4"
    android:weightSum="10"
    android:gravity="center">

    <ImageView
         android:layout_width="0dip"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/imageView3" />
</LinearLayout>

</LinearLayout>