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

时间:2017-01-12 06:03:14

标签: android xml

我想以多种屏幕尺寸支持我的Android屏幕,但我可以通过维护多个xml布局文件来实现它

但根据要求,我应该使用单一的XML布局来优化应用程序的使用。

所以请你能帮助我 我已经通过多个教程多个链接,但无法获得堆栈溢出的最后一个选项

9 个答案:

答案 0 :(得分:11)

<强>绘制:

对于图像,您必须根据屏幕分辨率管理不同的可绘制文件夹:

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

深入了解Support screen resolution

答案 1 :(得分:5)

Layouts Folder文件夹中为所有设备创建三个不同的res,并相应地使用这些维度。

通用布局文件夹

res/layout-small
res/layout-normal
res/layout-large
res/layout-xlarge

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

  1. 转换其他屏幕尺寸的正常尺寸。
  2. 将Normal Layout xml文件复制到其他文件夹中。
  3. 根据您所在的文件夹更改所用尺寸的后缀
  4. 调整可绘制文件夹中的图像资源(宽度和高度 - 与我们用于转换尺寸的技术相同)并将它们放在各自的可绘制文件夹中(drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xdpi等等。)。
  5. 然后,您的布局应该能够在每个设备上正确定位。
  6. 用于转换值

    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)
    

    此外,还推出了新的限定符   - 最小宽度   - AvailableScreenWidth   - AvailableScreenHeight

    在此处详细了解https://developer.android.com/guide/practices/screens_support.html

    我希望这会有所帮助。

答案 2 :(得分:3)

您可以尝试自动管理所有屏幕尺寸分辨率的图书馆。

compile 'com.intuit.sdp:sdp-android:1.0.4'

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

您需要指定:

android:layout_height="@dimen/_10sdp"

而不是:

android:layout_height="@dimen/10sdp"

答案 3 :(得分:2)

如果您提供文字大小为sp,其他尺寸为dp。 Android将根据设备密度自动调整不同的布局。如果要控制值,可以将values.xml中的值放在每个值文件夹中。不同密度设备的res内的values文件夹将如下:

    im1 = (ImageView) findViewById(R.id.imageView_id); //add proper ImageView id not NetworkimageView id


    ImageRequest imageRequest = new ImageRequest(IMAGE_URL, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(final Bitmap response) {
            im1.setImageBitmap(response);
        }
    }, 0, 0, ImageView.ScaleType.CENTER_INSIDE, null, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
        }
    });

    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
    requestQueue.add(imageRequest);

答案 4 :(得分:0)

那取决于你的代码

  1. 不要使用静态值
  2. 尝试使用换行内容
  3. 使用相对和线性布局取决于您的要求
  4. Drawables使用外翻DPI文件夹
  5. 查看这些链接

    1)https://developer.android.com/training/multiscreen/screensizes.html

    2)How to support different screen size in android

    3)Supporting multiple screen size - Android

答案 5 :(得分: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"/>

答案 6 :(得分:0)

有三种方法可以做到这一点:

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

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

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

答案 7 :(得分:0)

您可以定义多维文件,并根据屏幕大小添加每个视图的尺寸。 您可以找到详细的答案here

一组六个广义密度:

  • ldpi(低)~120dpi
  • mdpi(中)~160dpi
  • hdpi(高)~240dpi
  • xhdpi(超高)~320dpi
  • xxhdpi(extra-extra-high)~480dpi
  • xxxhdpi(extra-extra-extra-high)~640dpi

以下是official文档

答案 8 :(得分: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.