我已经完成了我的应用程序,现在需要处理适应多种屏幕尺寸。
此时似乎我唯一的选择是执行以下操作:
具有单独的xml布局:Small,Normal,Large和X-Large屏幕尺寸。 在其中有一个单独的xml布局:ldpi,mdpi,hdpi和xhdpi 在肖像和风景中有一个单独的xml布局。
一项活动共有32个布局。
我只是想知道是否有更好的方法来执行此操作,因为这将非常耗时,但是如果需要支持所有可能的设备,我不会介意它。
我做了一些阅读,人们说使用线性布局并使用重力,因为它是一个百分比,所以它在所有屏幕上看起来都一样。或者我可以使用RelativeLayout并使用“AlignAbove或Below”等。
然而,我的主要问题是尺寸错误,而元素的位置似乎通常在正确的位置。
有没有被广泛接受的方法来做到这一点?
我真的只是在寻找普通开发人员处理所有屏幕尺寸的“主流”方式。
答案 0 :(得分:15)
好问题。但是你这样做并不是一个" 专业"开发者会做的。 单个Activity不需要32个布局,Android足够智能处理事情。
没有layout.xml的多重定义/ dimens.xml的多重定义 是否可以提供多设备支持?
是的,这绝对是可能的,这就是你应该做的事情。为单个Activity布局定义32个布局并不是一件好事。
假设我在Play商店中有一个相当大的应用程序,有超过20个活动,现在如果我为一个Activity定义了32个布局,那么我的应用程序将有超过600个布局。 这可行吗?只要问问自己。
您需要先为 this页面提供非常好的阅读。它包含您需要知道的几乎所有内容。但我会帮助你把事情做好。
您无需为每种组合提供替代资源 屏幕尺寸和密度。该系统提供强大的兼容性 可以处理大部分渲染工作的功能 任何设备屏幕上的应用程序,只要您已实施 您的UI使用的技术可以优雅地调整大小
这句话足以让你相信你不应该这样做。 Android系统非常智能,可以相应地调整您的布局。相信我,它非常好。
在设计不同屏幕尺寸的用户界面时,您会发现这一点 每种设计都需要最小的空间。所以,每个都是概括的 上面的屏幕尺寸具有相关的最小分辨率 由系统。这些最小尺寸在" dp"单位 - 相同的单位 你应该在定义布局时使用
我将尝试指出您需要考虑的一些重要事项。
dp
或sp
。顾名思义,它们独立于不同设备的密度,因此在每个设备中看起来都相同。wrap_content
或match_parent
作为高度和宽度AbsoluteLayout
RelativeLayout
或LinearLayout
两者都适合您,您只需根据具体情况决定要使用哪一个Android Studio Rich Layout Editor
Android Studio有一个惊人的布局编辑器,您可以在其中立即预览布局。请看下面的截图,
我正在同时预览各种屏幕尺寸的应用程序的特定屏幕,我的布局看起来就像我希望它看起来一样。
我只有两个布局用于此活动,一个用于所有手机,一个用于所有平板电脑。
实践经验
如果您需要实际体验,我会在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>