如何在 Android 中使用单个 XML 布局文件支持多种屏幕尺寸?

10
我想在多个屏幕尺寸上支持我的Android屏幕,但我可以通过维护多个XML布局文件来完成。
但根据要求,为了优化应用程序的使用,我应该使用单个XML布局来完成。
所以请您能否帮助我?我已经查阅了多个教程和链接,但无法找到一个最终解决方案。

我认为没有其他解决方案,因为多个 XML 文件就是为了这个目的而设计的。或许你可以尝试通过相对于父视图和兄弟视图对齐来完成,或者给视图适当的权重,使它们在父布局中获得与权重成比例的空间,从而在显示上占据相应的空间。 - pankaj khedekar
1
您提供的备选资源可能会根据您的使用情况而有所不同。您可能不需要多个布局,只需要备选尺寸(例如)。此外,我认为担心有额外的布局文件是不值得的。通常会有一些阈值(通常基于屏幕大小),您希望有一个备选布局,这通常足够了(因此2个布局-非常合理)。此外,布局是XML格式,高度可压缩,并且与图像等物品相比占用极少的空间。 - Karakuri
9个回答

21

可绘制资源:

对于图片,您需要根据屏幕分辨率管理不同的可绘制资源文件夹:

drawable-ldpi        //240x320
drawable-mdpi        //320x480
drawable-hdpi        //480x800
drawable-xhdpi       //720x1280
drawable-xxhdpi      //1080X1920
drawable-xxxhdpi     //1440X2560
drawable-tvdpi       // nexus 7 etc 
drawable-xlarge-xhdpi //tablet like nexus 10  

尺寸: 如果您根据 UI 使用不同的静态尺寸,则必须将它们相对于其值定义为...文件夹。

不同智能手机分辨率的值文件夹:

values-ldpi\dimens.xml
values-mdpi\dimens.xml
values-hdpi\dimens.xml
values-xhdpi\dimens.xml
values-xxhdpi\dimens.xml
values-xxxhdpi\dimens.xml

注意:如果您使用sp/sip/dp/dip,那么这些值将根据设备的密度进行调整。 例如,假设您在mdpi(320X480)分辨率设备上为TextView设置了10sp。那么这个相同的值将自动适应其他分辨率。

mdpi(10sp==10px)
hdpi(15px)
xhdpi(20px)
xxhdpi(30px)
xxxhdpi(40px)

以下是一些常见的用于管理屏幕分辨率相关尺寸的文件夹。

不同屏幕使用不同的值文件夹:

values-sw720dp          10.1” tablet 1280x800 mdpi

values-sw600dp          7.0”  tablet 1024x600 mdpi

values-sw480dp          5.4”  480x854 mdpi 
values-sw480dp          5.1”  480x800 mdpi 

values-xxxhdpi                 1440X2560 xxxhdpi

values-xxhdpi                  1080X1920 xxhdpi

values-xhdpi            4.7”   1280x720 xhdpi 
values-xhdpi            4.65”  720x1280 xhdpi 

values-hdpi             4.0” 480x800 hdpi
values-hdpi             3.7” 480x854 hdpi

values-mdpi             3.2” 320x480 mdpi

values-ldpi             3.4” 240x432 ldpi
values-ldpi             3.3” 240x400 ldpi
values-ldpi             2.7” 240x320 ldpi

要深入了解,请访问支持屏幕分辨率


7
在您的res文件夹中为所有设备创建三个不同的布局文件夹(Layouts Folder),并根据需要使用相应的尺寸。 通用布局文件夹(Generic Layout Folders)
res/layout-small
res/layout-normal
res/layout-large
res/layout-xlarge

完成普通/中等布局后,请按照以下步骤操作:

  1. 将普通尺寸转换为其他屏幕尺寸。
  2. 将普通布局xml文件复制到其他文件夹中。
  3. 根据所在文件夹更改使用的尺寸后缀。
  4. 调整drawable文件夹中的图像资源大小(宽度和高度-与转换dimens使用的技术相同),并将它们放入相应的drawable文件夹中(drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xdpi等)。
  5. 然后您的布局应该在每个设备上正确定位。

转换数值

0.75 - ldpi  (small)   //mdpi dimens *0.75
1.0  - mdpi  (normal)  //First create these dimensions
1.5  - hdpi  (large)   //mdpi dimens *1.5
2.0  - xhdpi (xLarge)  //mdpi dimens *2.0

例如

android:layout_width="66dip" //in normal
android:layout_width="100dip"//in large 66*1.5=100(approx)
android:layout_width="52dip" //in small 66*0.75=52(approx)

新增了新的限定符:

  • SmallestWidth(最小宽度)
  • AvailableScreenWidth(可用屏幕宽度)
  • AvailableScreenHeight(可用屏幕高度)

在此处可阅读更多相关信息:https://developer.android.com/guide/practices/screens_support.html

希望这能对您有所帮助。


3
也许你可以尝试下面的库,它可以自动管理所有屏幕尺寸分辨率。
compile 'com.intuit.sdp:sdp-android:1.0.4'

您只需在build.gradle文件中添加依赖项即可完成。

您需要指定如下:

android:layout_height="@dimen/_10sdp"

通常情况下:

android:layout_height="@dimen/10dp"

2

如果你使用sp作为文本大小单位,使用dp作为其他尺寸单位,Android会根据设备的密度自动调整不同布局。如果你想要控制数值,可以将数值放在每个values文件夹中的dimens.xml文件中。不同密度设备内部的values文件夹如下:

values-ldpi\dimens.xml
values-mdpi\dimens.xml
values-hdpi\dimens.xml
values-xhdpi\dimens.xml
values-xxhdpi\dimens.xml
values-xxxhdpi\dimens.xml

1

0
您可以定义多维文件,并根据屏幕大小为每个视图添加维度。您可以在此处找到详细答案。
一组六个通用密度:
- ldpi(低密度)约120dpi - mdpi(中等密度)约160dpi - hdpi(高密度)约240dpi - xhdpi(超高密度)约320dpi - xxhdpi(超超高密度)约480dpi - xxxhdpi(超超超高密度)约640dpi
这里是官方文档。

0
尝试这个 https://developer.android.com/guide/topics/manifest/supports-screens-element.html
   <supports-screens android:resizeable=["true"| "false"]
                      android:smallScreens=["true" | "false"]
                      android:normalScreens=["true" | "false"]
                      android:largeScreens=["true" | "false"]
                      android:xlargeScreens=["true" | "false"]
                      android:anyDensity=["true" | "false"]
                      android:requiresSmallestWidthDp="integer"
                      android:compatibleWidthLimitDp="integer"
                      android:largestWidthLimitDp="integer"/>

0

有三种方法可以实现这个目标:

1)将您的图像和图标放入不同的drawable文件夹,包括drawable-mdpidrawable-hdpidrawable-xhdpidrawable-xxhdpidrawable-xxxhdpi,根据屏幕分辨率从特定文件夹访问图像。不要在所有地方应用固定值来缩放图像。 固定尺寸可能会因不同的设备而变化,并且图像看起来会被拉伸。 因此,请使用wrap_content

2)在不同的values文件夹中的dimens.xml中设置尺寸。

values-mdpi\dimens.xml
values-hdpi\dimens.xml
values-xhdpi\dimens.xml
values-xxhdpi\dimens.xml
values-xxxhdpi\dimens.xml

3) 使用 LinearLayout 并适当使用 android:layout_weight


0

如果您想使用单一布局,并且该布局应支持所有屏幕,如 ldpi、mdpi、hdpi、x-hdpi、xx-hdpi,则必须在布局中使用权重,以处理所有屏幕的屏幕大小。

以下是几件事情:

If you want to divide the space equally between Views with the same weight – set 0dp as Views’ width.
If you set View width to wrap_content – size of the Views will depend on weight and content inside each View.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接