如何在android中支持不同的屏幕大小

如何在android中支持不同的屏幕大小,android,screen,Android,Screen,我正在用android开发一个应用程序,我必须支持所有不同的屏幕大小和密度。所以我为布局创建了不同的文件夹:layout small layout large和layout 然后我为图像创建了不同的文件夹:ldpi、mdpi和hdpi。在所有可绘制文件夹中,图像必须具有不同的大小真的?我问这个原因是因为我有一部屏幕尺寸大、密度中等的手机,显示的图像会更小,而且尺寸不合适?Android自行调整如果您想在高分辨率设备和其他设备上使用不同的图像,您可以为不同的文件夹放置单独的图像。否则,只需将一些图

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


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

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

您需要在清单中为多个屏幕设置权限


添加到@ud\u an

为布局创建不同的文件夹不是一个好做法。创建您的布局,使其能够与所有屏幕尺寸配合使用。要实现这一点,请使用布局属性。
对于hdpi、mdpi和ldpi类型,您只需要有不同的图像。其余部分将由android操作系统管理。

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

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
清单中的以下代码支持所有DPI

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


还可以查看my.

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

检查这篇文章
您可以动态计算屏幕的尺寸

Display mDisplay= activity.getWindowManager().getDefaultDisplay();
int width= mDisplay.getWidth();
int Height= mDisplay.getHeight();
可以使用使用此方法获得的宽度和高度设置布局。

您可以使用大小单位而不是dp大小单位。尺寸单位与屏幕尺寸相关,因此通常优选用于确定多个屏幕尺寸


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

从Android 3.2(API级别13)开始,尺寸组(小、普通、大、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宽和更大)


有关更多信息,请阅读官方文档:

在支持多种屏幕尺寸方面,这听起来很高明。下面的GVE效果更好

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);
        }
在顶部,我已经创建了很多布局来适应多个屏幕,这完全取决于你,你可以也可以不。你可以看到play store评论,其中API下载量很高。你必须继续

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


使用Github中提供的哪些功能

真的吗?我的一个老应用使用了
dp
在布局文件夹中进行测量,在更大的分辨率上它看起来很愚蠢(小按钮、巨大的布局等),操作系统根本不能很好地处理它。但是代码很旧,所以可能是我做错了什么。如果您想最小化编码工作量,可以在一个布局中处理它们,而无需使用
dp
。避免硬编码版面大小,并使其动态写入内容。对于小按钮,正如我所说的,您需要不同的抽绳。由您自行重新编码不同的版面,或使版面在所有大小上都能工作。此处的更多信息:从3开始,不推荐使用不同的文件夹进行版面(如layout small)。2@Ricky我也有同样的问题…你做了什么来解决它?从3.2my布局到layout small和layout large,使用不同的文件夹进行布局(如layout small)是不推荐的layout xlarge未被采用。我们是否应添加layout xxlarge?这个答案在2019年仍然有用。能否请您回复我。我们如何检查哪台设备的布局显示为“小”和“默认”@Uttamyou可以从这里找到一些帮助,甚至不关闭的可能重复。我曾经试图探索这样的选择。。。我不会得到1920x1080,但取决于方向,比如1920x1036或我的导航条设置为什么。在景观中,我会得到1080x986,例如。。。
     Configuration config = getResources().getConfiguration();


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