如何设置android布局以支持所有屏幕尺寸?

wol*_*ine 21 android android-emulator android-layout

我正在开发一个关于android version2.2的程序.我已经阅读了很多关于支持多种屏幕尺寸的文档但仍然感到困惑 我设计了一个支持大屏幕和普通屏幕的布局文件,当我尝试使用小屏幕时,它不会调整布局以适应屏幕.我也在清单中使用了这段代码.

<supports-screens 
        android:resizeable="true"
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:anyDensity="true"
        />
Run Code Online (Sandbox Code Playgroud)

小屏幕的图像就在这里. 如何设置与小屏幕兼容的屏幕?在某处我通过使用文件夹"layout-small"找到了,但是如果我使用它,项目大小正在增加,我不希望这样,那么任何人都可以建议我这样做的最佳方法吗?

San*_*iya 34

所有屏幕的解决方案并支持所有布局.

                                 mdpi        hdpi       xhdpi       xxhdpi       xxxhdpi  
Launcher Icons (App Icons)      48 x 48     72 x 72    96 x 96     144 x 144    192 x 192
Action Bar,Toolbar,Tab Icons    24 x 24     36 x 36    48 x 48      72 x 72      96 x 96 
Notification Icons              24 x 24     36 x 36    48 x 48      72 x 72      96 x 96 
Run Code Online (Sandbox Code Playgroud)

可绘制文件夹:

ldpi:    Portrait: 240 X 320px.      Landscape: 320 X 240px.
mdpi:    Portrait: 320 X 480px.      Landscape: 480 X 320px.
hdpi:    Portrait: 480 X 800px.      Landscape: 800 X 480px.
xhdpi:   Portrait: 640 X 960px.      Landscape: 960 X 640px.
xxhdpi:  Portrait: 960 X 1600px.     Landscape: 1600 X 960px.
xxxhdpi: Portrait: 1280 X 1920px.    Landscape: 1920 X 1280px.  
Run Code Online (Sandbox Code Playgroud)

布局:

res/drawable        (default)
res/drawable-ldpi/  (240x320 and nearer resolution)
res/drawable-mdpi/  (320x480 and nearer resolution)
res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6edge).


ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
Run Code Online (Sandbox Code Playgroud)

参考链接:

不同分辨率支持android

https://developer.android.com/guide/practices/screens_support.html

https://design.google.com/devices/

所有基于Android的手机和平板电脑都有屏幕分辨率列表吗?

http://www.emirweb.com/ScreenDeviceStatistics.php

Android手机上最受欢迎的屏幕尺寸/分辨率


Gho*_*ost 18

请仔细阅读以下链接.这些可能会帮助你:

支持不同的屏幕尺寸

支持多个屏幕

支持不同的密度

支持平板电脑和手机

AFAIK,支持所有屏幕的唯一方法是通过做文件夹分叉.每个XML文件都高达几千字节.因此,尺寸不应该是一个问题.


Muh*_*bar 9

是的,我已经找到了解决问题的方法,你是对的我个人认为为每个屏幕分辨率制作布局都需要时间,并使你的项目规模变大.

为了使布局适合所有屏幕分辨率,我已经实现了我自己的技术,即以百分比设置宽度高度

当我们设置一些恒定的宽度高度值时,问题就出现了.Views/Layouts100dp

解决方案非常简单,尝试使用match_parent以便视图填充空白空间或使用weight并定义每个View相对于其他的相对,Views这将有助于您的布局在几乎每个屏幕分辨率和运行时设置LayoutParams只有那些Views/Layouts具有一些恒定宽度或以百分比表示的高度.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/mLayout"
        android:layout_width="280px"
        android:layout_height="300px" />


</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

注意:我已经使用PX为固定大小的布局的宽度/高度,因为在LayoutParams layoutParams = new LayoutParams(int width, int height);widthheight取的值作为像素

这是一个示例代码

final ViewTreeObserver mLayoutObserver = mLayout.getViewTreeObserver();

    mLayoutObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    {

        @Override
        public void onGlobalLayout() 
        {
            DisplayMetrics metrics = getResources().getDisplayMetrics();

            int deviceWidth = metrics.widthPixels;

            int deviceHeight = metrics.heightPixels;

            float widthInPercentage =  ( (float) 280 / 320 )  * 100; // 280 is the width of my LinearLayout and 320 is device screen width as i know my current device resolution are 320 x 480 so i'm calculating how much space (in percentage my layout is covering so that it should cover same area (in percentage) on any other device having different resolution

            float heightInPercentage =  ( (float) 300 / 480 ) * 100; // same procedure 300 is the height of the LinearLayout and i'm converting it into percentage

            int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );

            int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );

            LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);

            mLayout.setLayoutParams(layoutParams);
        }
    });
Run Code Online (Sandbox Code Playgroud)

我想这个代码几乎是自我解释的,如果任何人仍然需要帮助,你可以马上问

结论:如果你需要设置一些固定宽度/高度为您Views/Layouts在始终设置值像素的布局文件(即XML),然后以编程方式设置LayoutParams.

建议:我认为Google Android Guys应该认真考虑将设备更换dp/dippercentage.

  • 我创建了一个新的大小单位,实际上是你想要的百分比,你可以在[github](https://github.com/intuit/sdp)找到它. (2认同)

Kam*_*dov 9

现在支持不同的屏幕尺寸更容易了!使用新的尺寸单位SDP

SDP - 可扩展的大小单位

提供新大小单位的 android SDK - sdp(可伸缩 dp)。此尺寸单位随屏幕尺寸缩放。它可以帮助 Android 开发人员支持多屏幕。

对于文本视图,请参考ssp,它基于文本的 sp 大小单位。

https://github.com/intuit/sdp

  • 我遇到的最好的解决方案之一。只需将“implementation 'com.intuit.sdp:sdp-android:1.0.6'”包含到您的依赖项中,您就可以立即开始使用。为这个答案+1 (2认同)