【问题标题】:How to support different screen size in android如何在android中支持不同的屏幕尺寸
【发布时间】:2021-07-07 13:43:35
【问题描述】:

我正在用 android 开发一个应用程序,我必须支持所有不同的屏幕尺寸和密度。所以我为布局创建了不同的文件夹:layout-small layout-largelayout

然后我为图像创建了不同的文件夹:ldpi, mdpihdpi。在所有可绘制文件夹中,图像必须具有不同的大小,真的吗?请问这是因为我的手机屏幕尺寸大,密度中等,显示的图像会更小,而且尺寸不合适?

【问题讨论】:

标签: android screen


【解决方案1】:

对于不同的屏幕尺寸,以下是应用程序中的资源目录列表,该应用程序为不同的屏幕尺寸提供不同的布局设计,并为小、中、高和超高密度屏幕提供不同的位图可绘制对象。

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size
res/layout-large/my_layout.xml       // layout for large screen size
res/layout-xlarge/my_layout.xml      // layout for extra large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

res/drawable-mdpi/my_icon.png        // bitmap for medium density
res/drawable-hdpi/my_icon.png        // bitmap for high density
res/drawable-xhdpi/my_icon.png       // bitmap for extra high density

Manifest 中的以下代码支持所有 dpi。

<supports-screens android:smallScreens="true" 
          android:normalScreens="true" 
          android:largeScreens="true"
          android:xlargeScreens="true"
          android:anyDensity="true" />

还可以查看我的SO answer

【讨论】:

  • 对 layout-small 等布局使用不同的文件夹从 3.2 开始弃用
  • 我的 layout-large 和 layout-xlarge 布局没有被采用 y
  • 我们应该添加 layout-xxlarge 吗?
  • 这个答案在2019年还有用吗?请回复我一下。
  • 我们如何检查哪个设备的布局显示得像小和默认@Uttam
【解决方案2】:

从 Android 3.2(API 级别 13)开始,不推荐使用尺寸组(文件夹 small、normal、large、xlarge),取而代之的是一种基于可用屏幕宽度管理屏幕尺寸的新技术。



您可以根据布局的可用空间指定不同的资源配置:

1) 最小宽度 - 屏幕的基本尺寸,由可用屏幕区域的最短尺寸表示。

限定符值:sw'dp value'dp

例如。 res/sw600dp/layout.xml -> 将用于所有大于或等于 600dp 的屏幕尺寸。这没有考虑设备方向。


2) 可用屏幕宽度 - 以 dp 为单位指定资源应使用的最小可用宽度。

限定符值:w'dp value'dp

例如。 res/w600dp/layout.xml -> 将用于所有宽度大于或等于 600dp 的屏幕。


3) 可用屏幕高度 - 以 dp 为单位指定应使用资源的最小屏幕高度。

限定符值:h'dp value'dp

例如。 res/h600dp/layout.xml -> 将用于所有高度大于或等于 600dp 的屏幕。



因此,最后您的文件夹结构可能如下所示:

res/layout/layout.xml -> 用于手机(小于 600dp 可用宽度)
res/layout-sw600dp/layout.xml -> 适用于 7 英寸平板电脑(600dp 宽和更大)
res/layout-sw720dp/layout.xml -> 用于 10 英寸平板电脑(720dp 宽和更大)


更多信息请阅读官方文档:
https://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts

【讨论】:

  • 这里的最小值是指
  • 也可以用这个方法获取值,比如 values-h400dp ??
  • 这似乎不准确。例如,我有一个 layout-h400dp,Android Studio 一直为实际高度为 320 像素的设备选择该布局。
【解决方案3】:

您可以使用sdp 尺寸单位代替dp 尺寸单位。 sdp 尺寸单位是相对于屏幕尺寸的,因此通常首选用于定位多个屏幕尺寸。

谨慎使用!例如,在大多数情况下,您仍然需要为平板电脑设计不同的布局。

【讨论】:

  • 嗨,它是使用 sdp 库推荐的吗? @dimen/_18ssp
【解决方案4】:

在支持多种屏幕尺寸方面听起来很崇高。以下给出更好的结果。

res/layout/layout-w120dp
res/layout/layout-w160dp
res/layout/layout-w240dp
res/layout/layout-w160dp
res/layout/layout-w320dp
res/layout/layout-w480dp
res/layout/layout-w600dp
res/layout/layout-w720dp

使用显示指标检查设备宽度和高度

放置/找出适合设备最终宽度的布局。

let smallestScreenWidthDp="assume some value(Which will be derived from Display metrics)"

在setContentView()之前都应该检查,否则你就麻烦了

     Configuration config = getResources().getConfiguration();


        if (config.smallestScreenWidthDp >= 600) {
            setContentView(R.layout.layout-w600dp);
        } else {
            setContentView(R.layout.main_activity);
        }

在顶部,我创建了这么多布局以适应多个屏幕,这完全取决于你,你可能会或不会。你可以从哪个 API 看到 Play 商店评论,下载量很高..form 你必须继续。

我希望它对你有很大帮助。很少有人使用一些第三方库,这可能会减少你的工作,但这不是最佳实践。习惯 Android 最佳实践。

Check This Out

【讨论】:

  • 我创建了上述所有文件夹 (120dp-720dp),我只是在每个文件夹中复制了我的布局。这是正确的方法还是我应该在每个不同的文件夹中编辑每个不同的布局?
  • 更好的方法是在这些文件夹中存储一些值,例如边距或文本大小,并拥有一个布局文件
【解决方案5】:

使用 Github 中提供的sdp library

【讨论】:

  • 这个项目好像没有维护了。
【解决方案6】:

Android 自行调整,如果您想为高分辨率设备和其他设备使用不同的图像,您可以为不同的文件夹放置单独的图像。否则,只需为一些可以制作 9-patch 的图像放入一个可绘制的布局文件夹。

read here

您需要清单中的多屏权限support link

<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"/>

【讨论】:

【解决方案7】:

你可以动态计算出屏幕的尺寸

Display mDisplay= activity.getWindowManager().getDefaultDisplay();
int width= mDisplay.getWidth();
int Height= mDisplay.getHeight();

可以使用通过该方法获得的宽度和高度来设置布局。

【讨论】:

  • 甚至没有关闭。我曾经尝试探索这样的选项......我不会得到 1920x1080,但取决于方向,例如 1920x 1036 或我的导航栏设置的任何内容。例如,在风景中,我会得到 1080x986 ...我希望它这么简单 ....类似于 html 和老式表格的使用 buuut .... :(
【解决方案8】:

添加到@ud_an

为布局创建不同的文件夹不是一个好习惯。创建您的布局,使其适用于所有屏幕尺寸。为此,请使用布局属性。 您只需要为 hdpi、mdpi 和 ldpi 类型设置不同的图像。其余的将由 android OS 管理。

【讨论】:

  • 真的吗?我的一个旧应用程序使用dp 进行布局文件夹中的测量,在更大的分辨率上它看起来很愚蠢(小按钮、巨大的布局等),操作系统根本不能很好地处理它。虽然代码很旧,所以也许我做错了什么。
  • 如果您想尽量减少编码工作,您可以在一个布局中处理所有这些,而无需使用dp。避免对布局大小进行硬编码,并使它们在内容中动态化。正如我所说,对于小按钮,您需要不同的可绘制对象。您可以重新编码不同的布局或使布局适用于所有尺寸。
  • 对 layout-small 等布局使用不同的文件夹从 3.2 开始弃用
  • @Ricky 我也有同样的问题......你做了什么来解决它?
【解决方案9】:

您可以为应用程序将运行的高分辨率/大小创建位图,并在代码中调整它们的大小(在运行时)

查看这篇文章 http://nuvornapps-en.blogspot.com.es/

【讨论】:

  • 这不能正确回答问题。
猜你喜欢
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多