如何在Android中为每个不同的屏幕尺寸定义dimens.xml?


128

Android中支持不同的屏幕尺寸(密度)时,通常的重点是为每个可能的屏幕创建不同的布局。IE浏览器

  • 分辨率
  • 分辨率
  • 分辨率
  • xhdpi
  • xxhdpi
  • xxxhdpi

我为xhdpi屏幕设计了一个布局作为参考,并在dimens.xml中定义了它的尺寸。现在,我想为所有可能的屏幕尺寸提供支持。我怎样才能做到这一点?

据我所知,我可以使用工具找出其他屏幕尺寸的正确dimens.xml并将其添加到我的项目中。在我的情况下,这是正确的方法吗?

另一个问题,我是否只需要为上述屏幕尺寸创建dimens.xml?如果是,那是什么w820dp

谢谢你的帮助。我只需要支持电话(不支持平板电脑或其他设备)。


1
是的,您必须dimesn.xml为不同的分辨率创建不同的文件。
Piyush

@PiyushGupta上面所有的尺寸屏幕都适合吗?但是W820dp它支持不同的Android版本是什么呢?您还可以在dimens.xml的基础上建议我任何有关支持不同屏幕的教程吗?
阿米特·帕尔

适用于平板电脑或其他产品。否则,正如我所说,您需要创建一个其他值文件夹。
Piyush

Answers:


266

您必须为不同的屏幕创建不同的值文件夹。喜欢

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-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxxhdpi           5.5" 1440x2560 xxxhdpi

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

在此处输入图片说明

欲了解更多信息,请访问这里

Android中的不同值文件夹

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

@humblerookie编辑

您可以使用名为Dimenify的Android Studio插件根据自定义比例因子自动为其他像素桶生成尺寸值。它仍处于测试阶段,请务必将遇到的任何问题/建议通知开发人员。


1
不应该有“ values-sw480dp-hdpi” .xhdpi和xxhdpi等吗?只有320dp的答案如此。.请回复
Sharp Edge

2
@IntelliJAmiya:您应该提到Android <= 3.2和> 3.2之间的区别。
juergen d 2016年

5
@IntelliJAmiya我创建了一个名为Dimenify的工作室插件。这使您可以轻松地为其他铲斗创建尺寸。您可以添加相同的编辑内容,以便其他人使用吗? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie

3
这个Dimenify是一个很棒的工具
Muhammed Refaat

1
肯定@IntelliJAmiya,将有那些文件夹中没有涉及的新版本和/或可能不适用于某些文件夹。
ralphgabb17年

35

使用可扩展DP

尽管从理论上说,为不同的屏幕尺寸设置不同的布局是一个好主意,但要适应所有屏幕尺寸和像素密度可能会变得非常困难。dimens.xml如以上答案所示,拥有20多个不同的文件根本不容易管理。

如何使用:

使用方法sdp

  1. 包括implementation 'com.intuit.sdp:sdp-android:1.0.5'在您的中build.gradle
  2. 更换任何dp值,例如50dp@dimen/50_sdp像这样:

    <TextView
     android:layout_width="@dimen/_50sdp"
     android:layout_height="@dimen/_50sdp"
     android:text="Hello World!" />

这个怎么运作:

sdp因为它实际上是dimens.xml每个可能dp值的巨大清单,所以会随屏幕尺寸缩放。

在此处输入图片说明

实际观看:

这是在三种设备上,它们的屏幕尺寸和密度差异很大:

在此处输入图片说明

请注意,sdp由于某些性能和可用性限制,大小单位计算包括一些近似值。


多谢。这对我真的很有用。
twenk11k

@Advait您能否告诉我,对于2560x1440分辨率的5.5英寸手机,三星Edge 7应该使用哪个值文件夹?
ULHAS PATIL

@Advait当前我正在使用values-xxhdpi文件夹,但问题是,它正在5、5.5和6屏幕的同一文件夹中使用同一文件夹,因此在5英寸屏幕和5.5上出现了滚动。我不要 你能帮我吗?
ULHAS PATIL

@Advait价值观,xxhdpi 5.5" 1080×1920及另外5.5" 1440x2560我想为5.5" 1440x2560不同的文件夹。
ULHAS PATIL

完全是@ULHASPATIL!我碰到类似的问题,不知道如何解决。您是否找到了类似英寸和不同像素分辨率的屏幕解决方案?
Georgiy Chebotarev

27

我们希望在不同的屏幕中查看所需视图尺寸的变化。

我们需要为不同的屏幕创建一个不同的values文件夹,并根据屏幕密度放置dimens.xml文件。

当我在不同的value文件夹中更改dimens.xml时,我采用了一个TextView并观察了这些更改。

请遵循流程

正常-xhdpi \ dimens.xml

当我们更改常规屏幕时,以下设备可以更改屏幕尺寸-xhdpi \ dimens.xml

连结5X(5.2“ * 1080 * 1920:420dpi)

连结6P(5.7“ * 1440 * 2560:560dpi)

连结6(6.0“ * 1440 * 2560:560dpi)

连结5(5.0“,1080 1920:xxhdpi)

连结4(4.7“,768 * 1280:xhdpi)

Galaxy nexus(4.7英寸,720 * 1280:xhdpi)

4.65英寸720p(720 * 1280:xhdpi)

4.7英寸WXGA(1280 * 720:Xhdpi)

Xlarge-xhdpi \ dimens.xml

更改Xlarge时,以下设备可以更改屏幕尺寸-xhdpi \ dimens.xml

连结9(8.9吋,2048 * 1556:xhdpi)

连结10(10.1“,2560 * 1600:xhdpi)

大-xhdpi \ dimens.xml

更改大尺寸-xhdpi \ dimens.xml时,以下设备可以更改屏幕尺寸

连结7(7.0吋,1200 * 1920:xhdpi)

连结7(2012)(7.0吋,800 * 1280:tvdpi)

在“搜索通用手机和平板电脑”中可以看到以下屏幕

大-mdpi \ dimens.xml

更改大尺寸时,以下设备可以更改屏幕尺寸-mdpi \ dimens.xml

5.1英寸WVGA(480 * 800:mdpi)

5.4英寸FWVGA(480 * 854:mdpi)

7.0英寸WSVGA(平板电脑)(1024 * 600:mdpi)

正常-hdpi \ dimens.xml

当我们更改常规屏幕时,以下设备可以更改屏幕尺寸-hdpi \ dimens.xml

连结s(4.0“,480 * 800:hdpi)

连结一(3.7吋,480 * 800:hdpi)

小-ldpi \ dimens.xml

当我们更改小尺寸时,以下设备可以更改屏幕尺寸-ldpi \ dimens.xml

2.7英寸QVGA滑块(240 * 320:ldpi)

2.7英寸QVGA(240 * 320:ldpi)

xlarge-mdpi \ dimens.xml

当我们更改xlarge时,以下设备可以更改屏幕尺寸-mdpi \ dimens.xml

10.1英寸WXGA(tABLET)(1280 * 800:MDPI)

正常-ldpi \ dimens.xml

更改常规屏幕时,以下设备可以更改屏幕大小-ldpi \ dimens.xml

3.3英寸WQVGA(240 * 400:LDPI)

3.4英寸WQVGA(240 * 432:LDPI)

正常-hdpi \ dimens.xml

当我们更改常规屏幕时,以下设备可以更改屏幕尺寸-hdpi \ dimens.xml

4.0英寸WVGA(480 * 800:hdpi)

3.7英寸WVGA(480 * 800:hdpi)

3.7英寸FWVGA滑块(480 * 854:hdpi)

正常-mdpi \ dimens.xml

当我们更改常规屏幕时,以下设备可以更改屏幕尺寸-mdpi \ dimens.xml

3.2英寸HVGA滑块(ADP1)(320 * 480:MDPI)

3.2英寸QVGA(ADP2)(320 * 480:MDPI)


因此,根据您的文件夹,然后将命名为values-normal-xhdpi
VonSchnauzer

是的,我同意您的看法,而不是向所有文件写入值,而是说“为不同的文本大小创建不同的值文件夹”。因此,请阅读标题。谢谢。
koteswarao

9

有不错的库可以处理一切并减轻您的痛苦。为了使用它,只需在gradle中添加两个依赖项:

 implementation 'com.intuit.ssp:ssp-android:1.0.5'
 implementation 'com.intuit.sdp:sdp-android:1.0.5'

之后,dimens像这样使用:

        android:layout_marginTop="@dimen/_80sdp"

3
以下是供参考的库:SDPSSP。并感谢您提供准确的答案!
JorgeAmVF

7

我上传了一个简单的Java程序,它将您的项目位置和您要输入的尺寸文件作为输入。基于此,它将在控制台中输出相应的尺寸文件。这是它的链接:

https://github.com/akeshwar/Dimens-for-different-screens-in-Android/blob/master/Main.java

这是供参考的完整代码:

public class Main {


    /**
     * You can change your factors here. The current factors are in accordance with the official documentation.
     */
    private static final double LDPI_FACTOR = 0.375;
    private static final double MDPI_FACTOR = 0.5;
    private static final double HDPI_FACTOR = 0.75;
    private static final double XHDPI_FACTOR = 1.0;
    private static final double XXHDPI_FACTOR = 1.5;
    private static final double XXXHDPI_FACTOR = 2.0;

    private static double factor;

    public static void main(String[] args) throws IOException {


        Scanner in = new Scanner(System.in);
        System.out.println("Enter the location of the project/module");
        String projectPath = in.nextLine();

        System.out.println("Which of the following dimension file do you want?\n1. ldpi \n2. mdpi \n3. hdpi \n4. xhdpi \n5. xxhdpi \n6. xxxhdpi");

        int dimenType = in.nextInt();

        switch (dimenType) {
            case 1: factor = LDPI_FACTOR;
                break;
            case 2: factor = MDPI_FACTOR;
                break;
            case 3: factor = HDPI_FACTOR;
                break;
            case 4: factor = XHDPI_FACTOR;
                break;
            case 5: factor = XXHDPI_FACTOR;
                break;
            case 6: factor = XXXHDPI_FACTOR;
                break;
            default:
                factor = 1.0;
        }

        //full path = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/src/main/res/values/dimens.xml"
        //location of the project or module = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/"


        /**
         * In case there is some I/O exception with the file, you can directly copy-paste the full path to the file here:
         */
        String fullPath = projectPath + "/src/main/res/values/dimens.xml";

        FileInputStream fstream = new FileInputStream(fullPath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine;

        while ((strLine = br.readLine()) != null)   {
            modifyLine(strLine);
        }
        br.close();

    }

    private static void modifyLine(String line) {

        /**
         * Well, this is how I'm detecting if the line has some dimension value or not.
         */
        if(line.contains("p</")) {
            int endIndex = line.indexOf("p</");

            //since indexOf returns the first instance of the occurring string. And, the actual dimension would follow after the first ">" in the screen
            int begIndex = line.indexOf(">");

            String prefix = line.substring(0, begIndex+1);
            String root = line.substring(begIndex+1, endIndex-1);
            String suffix = line.substring(endIndex-1,line.length());


            /**
             * Now, we have the root. We can use it to create different dimensions. Root is simply the dimension number.
             */

            double dimens = Double.parseDouble(root);
            dimens = dimens*factor*1000;
            dimens = (double)((int)dimens);
            dimens = dimens/1000;
            root = dimens + "";

            System.out.println(prefix + " " +  root + " " + suffix );

        }

        System.out.println(line);
    }
}

6

您必须values为不同的屏幕创建一个不同的文件夹,然后dimens.xml根据密度放置文件。

1) values

2) values-hdpi (320x480 ,480x800)

3) values-large-hdpi (600x1024)

4) values-xlarge (720x1280 ,768x1280 ,800x1280 ,Nexus7 ,Nexus10)

5) values-sw480dp (5.1' WVGA screen)

6) values-xhdpi (Nexus4 , Galaxy Nexus)

在屏幕尺寸之间我能从哪里得到口粮?正如我可以在工具中看到他们所定义的一切ldpimdpi态度
阿米特·帕尔

这将取决于您的values文件夹,该文件夹最多将是其中的检索值。
Piyush

values-xxhdpiNexus 6 需要提及吗?
阿米特·帕尔

是的,你需要成为!
Piyush 2015年

320x480是典型的mdpi。所以,把它无论是在valuesvalues-mdpi
Phantômaxx

6

你可以把dimens.xml

1)价值观

2)值-hdpi

3)值-xhdpi

4)值-xxhdpi

dimens.xml根据密度在相应的文件夹中指定不同的大小。


2
根据Android文档,小/普通/大不推荐使用。
本杰明·梅辛

1

如果你想查看更多:这里有一个链接的设备(平板电脑,手机,手表),包括列表watchchromebookwindowsmac。在这里,您可以找到密度,尺寸等。仅在此处建立密度,如果您也使用仿真器,它是一个很好的资源。

如果单击特定项目,它将在右侧显示更多详细信息。 样品

既然是Android,我将发布与此相关的信息。 样本1

样本2

〜最好保存网络副本。离线查看。


1

Android 3.2引入了一种新的屏幕尺寸方法,描述屏幕尺寸的数字均以“ dp”为单位。大多数情况下,我们可以使用

最小宽度dp:可用于应用程序布局的最小宽度,以“ dp”为单位;这是显示屏旋转时所遇到的最小宽度dp。

要创建一个右键单击res >>> new >>> Android资源目录

从“ 可用的限定词”窗口中将“最小屏幕宽度”移动到“ 选定的限定词”

屏幕宽度窗口中,只需输入“ dp”值即可,您希望Android Studio使用该值变暗。

比更改为项目视图,右键单击您新创建的资源目录

新建 >>> 值资源文件,输入新文件名dimens.xml,您就完成了。


感谢您解释如何实际创建这些文件夹。
Beko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.