【问题标题】:Android handling multiple screens... (Relative Layout or Linear Layout)?Android 处理多个屏幕...(相对布局或线性布局)?
【发布时间】:2012-06-13 20:27:16
【问题描述】:

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

在这一点上,我唯一的选择似乎是执行以下操作:

有一个单独的 xml 布局:Small、Normal、Large 和 X-Large 屏幕尺寸。 在其中有一个单独的 xml 布局:ldpi、mdpi、hdpi 和 xhdpi 在纵向和横向中有一个单独的 xml 布局。

一个活动总共有 32 个布局。

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

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

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

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

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

【问题讨论】:

  • 为什么不支持不同密度的设备?你能描述一下吗?
  • @ranjith 您对我发布的答案有任何疑问吗?我可以通过其他方式帮助您吗?

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


【解决方案1】:

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

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

dp

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

sp

Scale-independent Pixels - 这类似于 dp 单位,但它也根据用户的字体大小偏好进行缩放。推荐你 指定字体大小时使用此单位,因此它们将被调整为 屏幕密度和用户偏好。

来自安卓文档。

【讨论】:

  • 我所有的单位都在 dp 但是当使用不同的密度时,一个 dp 的值是不同的。因此,在 Hdpi 手机上,dp 的值是 ldpi 的一半。因此,在 ldpi 手机上,所有边距都是应有的一半。在这种情况下 dp 根本没有帮助。
  • 显然,制作 32 种不同的布局并不是正确的选择。在我看来,使用 LinearLayout 来使用百分比值是一个不错的选择。你正在处理什么样的观点?也许更改缩放属性可能会有所帮助。
  • 好吧,我在应用程序中的主要活动是图像视图。基于持续的研究,我发现一种方法是为每个屏幕尺寸做一个布局/端口,然后根据 ldpi、mdpi、hdpi 和 xhdpi 提供不同的图像。我将做一些测试,看看这是否能提供所需的结果。
  • 检查这个帖子,它可能对你有帮助:stackoverflow.com/questions/2521959/…
【解决方案2】:

好问题。但你这样做的方式不是“专业”开发人员会这样做的。 单个 Activity 不需要 32 个布局,Android 足够智能来处理事情。

没有布局的多定义/dimens.xml的多定义 是否可以支持多设备?

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

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

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

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

这句话足以让你相信你不应该这样做。 Android 系统足够智能,可以相应地调整您的布局。相信我,它在这方面真的很棒。

当您针对不同的屏幕尺寸设计用户界面时,您会发现 每个设计都需要最少的空间。所以,每个广义 上面的屏幕尺寸具有定义的关联最小分辨率 由系统。这些最小尺寸以“dp”为单位——相同的单位 您应该在定义布局时使用

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

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

Android Studio 丰富的布局编辑器

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

我正在以各种屏幕尺寸同时预览我的应用的特定屏幕,并且我的布局看起来和我想要的一样,在所有这些屏幕中

我只为这个 Activity 设置了两种布局,一种用于所有手机,一种用于所有平板电脑。

实践经验

如果您想要实际体验,我在 Play 商店中运行了一个应用程序,成千上万的用户在 8000 多种不同屏幕尺寸的不同设备上使用该应用程序。

我只有 2 种用于特定 Activity 的布局,一种用于手机,一种用于平板电脑。我的应用程序的用户界面在所有设备上看起来都不错,而且我从未收到任何用户的抱怨。如果您需要,here 是应用程序的链接。

我相信这个详细的答案可以解决您的所有疑问,如果没有,请随时告诉我。我很乐意提供进一步的帮助。

UDPATE

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

您需要一种或两种布局,这完全取决于您设计的特定布局。所有布局都与其他布局不同。 技术上不能将其定义为主观的。没有经验法则。但我会尽量正式地帮助你。

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

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

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

  • 尝试查看您的布局在所有屏幕尺寸(从 4 英寸到 10 英寸平板电脑)中是否看起来都不错。看看间距、图片大小、字体大小是否都正确。

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

就像在我的应用程序中一样,我有 2 个单独的布局,仅用于 5-6 个活动,但对于其余的,我只有一个布局。这一切都取决于特定的布局。

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

【讨论】:

  • 1+ 以获得详细描述的答案!
  • @ranjith 我已经更新了答案。我已尽力消除您的困惑。如果您仍有任何疑问,请随时告诉我。
  • 我使用 4 个dimens.xml 值(小、正常、大、超大).. 这种方法正确与否?
  • 是的,没错。使用 4 个dimens.xml 没有任何问题。但请务必使用实时预览检查布局,以确保应用了正确的尺寸。
  • @ranjith 谢谢。很高兴能提供帮助。
【解决方案3】:

您可以通过动态设计布局来实现这一点。它可以适合所有屏幕。在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>

【讨论】:

    【解决方案4】:

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

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

    在混淆之前只需下载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添加不同的drawables

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

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


    最后别忘了在android manifest文件中使用&lt;supports-screens&gt;&lt;compatible-screens&gt;


    编辑:

    我可以使用 values-large 和 values-xlarge 吗?我很困惑 值-大和值-sw600dp

    注意:从 Android 3.2(API 级别 13)开始,这些尺寸组已被弃用,取而代之的是一种基于可用屏幕宽度管理屏幕尺寸的新技术。如果您正在为 Android 3.2 及更高版本进行开发,请参阅Declaring Tablet Layouts for Android 3.2 了解更多信息。

    首先阅读以上指南,根据它们我们不必使用such as large or xlarge,只需使用600dp of width。那是> = 3.2 android os。它在每台设备上都可以正常工作,但您可能会在 GALAXY TAB-2、GRAND 等 GALAXY 系列设备中遇到问题,因为它们有时具有旧 API,您可以使用 values-large 和 values-xlarge。这是特定于设备的问题,仅在需要时才执行。


    另外请注意,根据需要创建上述布局多个文件,就像我们在布局中有 listview 一样,然后只需为包括平板电脑在内的所有设备创建一个相同的文件,这样您也可以管理您的应用程序大小。

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

    【讨论】:

    • 我可以使用 values-large 和 values-xlarge 吗?我对 values-large 和 values-sw600dp 感到困惑
    • @ranjith:检查我在回答中的编辑,如果有其他问题请评论
    • 感谢另一个很好的回答..但我不能投票两次..我已经把赏金给了另一个人。祝你有美好的一天..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多