13

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

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

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

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

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

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

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

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

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

4

4 回答 4

15

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

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

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

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

你需要先给 这个页面一个非常好的阅读。它几乎包含您需要知道的所有内容。但我会帮你把事情做好。

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

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

当您为不同的屏幕尺寸设计 UI 时,您会发现每种设计都需要最少的空间。因此,上面的每个通用屏幕尺寸都有一个由系统定义的相关最小分辨率。这些最小尺寸以“dp”为单位——与您在定义布局时应使用的单位相同

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

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

Android Studio 丰富的布局编辑器

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

在此处输入图像描述

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

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

实践经验

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

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

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

UDPATE

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

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

您需要充分利用Android Studio 丰富的布局编辑器及其出色的实时预览功能。

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

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

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

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

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

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

于 2015-08-13T05:09:02.007 回答
3

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

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

dp

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

sp

与比例无关的像素 - 这类似于 dp 单位,但它也根据用户的字体大小偏好进行缩放。建议您在指定字体大小时使用此单位,以便根据屏幕密度和用户偏好进行调整。

来自android文档。

于 2012-06-10T19:14:58.197 回答
1

我认为阅读文档很好,他们解释了有关支持多屏的每一件事。

但是每个人都混淆了我们必须如何以及何时使用它,对吗?

在混淆之前只需下载官方示例代码(如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 和 2(根据要求)的组合,而 POINT-3 是通用的:)。阅读最佳实践


最后别忘了在android manifest文件中使用<supports-screens>and<compatible-screens>


编辑:

我可以使用 values-large 和 values-xlarge 吗?我对 values-large 和 values-sw600dp 感到困惑

注意:从 Android 3.2(API 级别 13)开始,这些尺寸组已被弃用,取而代之的是一种基于可用屏幕宽度管理屏幕尺寸的新技术。如果您正在为 Android 3.2 及更高版本进行开发,请参阅为 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 布局让您的生活更轻松。

于 2015-08-17T13:26:04.680 回答
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>
于 2015-08-17T13:00:43.743 回答