How to define dimens.xml for every different screen size in android?

后端 未结 9 1802
轮回少年
轮回少年 2020-11-22 00:43

When supporting different screen sizes (densities) in Android often the focus is on creating different layouts for every possible screen. I.E.

相关标签:
9条回答
  • 2020-11-22 01:21

    There are nice libraries which will handle everything and reduce your pain. For using it, just add two dependencies in gradle:

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

    After that, use dimens like this:

            android:layout_marginTop="@dimen/_80sdp"
    
    0 讨论(0)
  • 2020-11-22 01:21

    I've uploaded a simple java program which takes your project location and the dimension file you want as input. Based on that, it would output the corresponding dimension file in the console. Here's the link to it:

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

    Here's the full code for the reference:

    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);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:24

    we want to see the changes of required view size in different screens.

    We need to create a different values folders for different screens and put dimens.xml file based on screen densities.

    I have taken one TextView and observed the changes when i changed dimens.xml in different values folders.

    Please follow the process

    normal - xhdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the normal - xhdpi \ dimens.xml

    nexus 5X ( 5.2" * 1080 * 1920 : 420dpi )

    nexus 6P ( 5.7" * 1440 * 2560 : 560dpi)

    nexus 6 ( 6.0" * 1440 * 2560 : 560dpi)

    nexus 5 (5.0", 1080 1920 : xxhdpi)

    nexus 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

    The below devices can change the sizes of screens when we change the Xlarge - xhdpi \ dimens.xml

    nexus 9 ( 8.9", 2048 * 1556 : xhdpi)

    nexus 10 (10.1", 2560 * 1600 : xhdpi)

    large - xhdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the large - xhdpi \ dimens.xml

    nexus 7 ( 7.0", 1200 * 1920: xhdpi)

    nexus 7 (2012) (7.0", 800 * 1280 : tvdpi)

    The below screens are visible in " Search Generic Phones and Tablets "

    large - mdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the large - mdpi \ dimens.xml

    5.1" WVGA ( 480 * 800 : mdpi )

    5.4" FWVGA ( 480 * 854 : mdpi )

    7.0" WSVGA (Tablet) ( 1024 * 600 : mdpi )

    normal - hdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the normal - hdpi \ dimens.xml

    nexus s ( 4.0", 480 * 800 : hdpi )

    nexus one ( 3.7", 480 * 800: hdpi)

    small - ldpi \ dimens.xml

    The below devices can change the sizes of screens when we change the small - ldpi \ dimens.xml

    2.7" QVGA Slider ( 240 * 320 : ldpi )

    2.7" QVGA ( 240 * 320 : ldpi )

    xlarge - mdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the xlarge - mdpi \ dimens.xml

    10.1" WXGA ( tABLET) ( 1280 * 800 : MDPI )

    normal - ldpi \ dimens.xml

    The below devices can change the sizes of screens when we change the normal - ldpi \ dimens.xml

    3.3" WQVGA ( 240 * 400 : LDPI )

    3.4" WQVGA ( 240 * 432 : LDPI )

    normal - hdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the normal - hdpi \ dimens.xml

    4.0" WVGA ( 480 * 800 : hdpi )

    3.7" WVGA ( 480 * 800 : hdpi )

    3.7" FWVGA Slider ( 480 * 854 : hdpi )

    normal - mdpi \ dimens.xml

    The below devices can change the sizes of screens when we change the normal - mdpi \ dimens.xml

    3.2" HVGA Slider ( ADP1 ) ( 320 * 480 : MDPI )

    3.2" QVGA ( ADP2 ) ( 320 * 480 : MDPI )

    0 讨论(0)
提交回复
热议问题