วิธีกำหนด dimens.xml สำหรับทุกขนาดหน้าจอที่แตกต่างกันใน Android


128

เมื่อรองรับขนาดหน้าจอที่แตกต่างกัน (ความหนาแน่น) ในAndroidมักให้ความสำคัญกับการสร้างเค้าโครงที่แตกต่างกันสำหรับทุกหน้าจอที่เป็นไปได้ IE

  • ldpi
  • mdpi
  • hdpi
  • XHDPI
  • xxhdpi
  • xxxhdpi

ผมออกแบบรูปแบบสำหรับXHDPIหน้าจอเป็นข้อมูลอ้างอิงและกำหนดมันมิติในdimens.xml ตอนนี้ฉันต้องการให้การสนับสนุนกับทุกขนาดหน้าจอที่เป็นไปได้ ฉันจะทำเช่นนั้นได้อย่างไร?

เท่าที่ฉันรู้ฉันสามารถใช้เครื่องมือนี้เพื่อหาdimens.xmlที่เหมาะสมสำหรับขนาดหน้าจออื่น ๆ และเพิ่มลงในโปรเจ็กต์ของฉัน นี่เป็นวิธีที่ถูกต้องในสถานการณ์ของฉันหรือไม่?

คำถามอื่นฉันต้องสร้างdimens.xmlสำหรับขนาดหน้าจอด้านบนเท่านั้นหรือไม่ ถ้าใช่แล้วคือw820dpอะไร?

ขอบคุณสำหรับความช่วยเหลือของคุณ. ฉันต้องการรองรับโทรศัพท์เท่านั้น (ไม่ใช่แท็บเล็ตหรืออุปกรณ์อื่น ๆ )


1
ใช่คุณต้องสร้างdimesn.xmlไฟล์อื่นสำหรับความละเอียดที่แตกต่างกัน
Piyush

@PiyushGupta นั่นจะสำหรับหน้าจอมิติทั้งหมด? แต่อะไรคือW820dpสิ่งที่รองรับ Android เวอร์ชันอื่น? นอกจากนี้คุณสามารถแนะนำการสอนเกี่ยวกับการรองรับหน้าจอที่แตกต่างกันบนพื้นฐานของ dimens.xml ให้ฉันได้ไหม
Amit Pal

สำหรับแท็บเล็ตหรือสำหรับผู้อื่น อย่างที่ฉันบอกว่าคุณต้องสร้างโฟลเดอร์ค่าอื่น
Piyush

คำตอบ:


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

คุณสามารถใช้ปลั๊กอิน Android Studio ที่เรียกว่าDimenifyเพื่อสร้างค่ามิติข้อมูลสำหรับที่เก็บพิกเซลอื่น ๆ โดยอัตโนมัติตามปัจจัยขนาดที่กำหนดเอง ยังอยู่ในรุ่นเบต้าโปรดแจ้งปัญหา / ข้อเสนอแนะที่คุณพบให้กับนักพัฒนาซอฟต์แวร์ทราบ


1
ไม่ควรมี "values-sw480dp-hdpi" .xhdpi และ xxhdpi เป็นต้น? มีเพียง 320dp ในคำตอบของคุณ .. โปรดตอบกลับ
Sharp Edge

2
@IntelliJAmiya: คุณควรพูดถึงความแตกต่างระหว่าง Android <= 3.2 และ> 3.2
juergen วันที่

5
@IntelliJAmiya ฉันได้สร้างปลั๊กอินสตูดิโอชื่อ Dimenify สิ่งนี้ช่วยให้คุณสร้างมิติข้อมูลสำหรับที่เก็บข้อมูลอื่น ๆ ได้อย่างง่ายดาย คุณสามารถเพิ่มการแก้ไขด้วยสิ่งเดียวกันเพื่อให้คนอื่นใช้ประโยชน์ได้หรือไม่? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie

3
Dimenify นี้เป็นเครื่องมือที่ยอดเยี่ยม
Muhammed Refaat

1
@IntelliJAmiya แน่นอนว่าจะมีการเปิดตัวใหม่ที่จะไม่ครอบคลุมในโฟลเดอร์เหล่านั้นและ / หรืออาจไม่เหมาะสมในบางโฟลเดอร์
ralphgabb

36

ใช้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คำนวณหน่วยขนาดมีการประมาณบางอย่างเนื่องจากข้อ จำกัด ด้านประสิทธิภาพและความสามารถในการใช้งาน


1
มีภาระผูกพันมาก สิ่งนี้มีประโยชน์มากสำหรับฉัน
twenk11k

@Advait คุณช่วยบอกฉันได้ไหมว่าฉันควรใช้โฟลเดอร์ค่าใดสำหรับ Samsung Edge 7 ที่มีมือถือ 5.5 นิ้วที่มีความละเอียด 2560x1440
ULHAS PATIL

@Advait ตอนนี้ฉันใช้โฟลเดอร์ values-xxhdpi แต่ปัญหาคือใช้โฟลเดอร์เดียวกันสำหรับโฟลเดอร์เดียวกัน 5, 5.5 และ 6 หน้าจอดังนั้นจึงมีการเลื่อนปรากฏบนหน้าจอ 5 นิ้วและ 5.5 ฉันไม่ต้องการสิ่งนั้น คุณช่วยฉันในเรื่องนี้ได้ไหม
ULHAS PATIL

@Advait S values-xxhdpi สำหรับ 5.5 "1080x1920 และสำหรับ 5.5" 1440x2560 ฉันต้องการโฟลเดอร์อื่นสำหรับ 5.5 "1440x2560
ULHAS PATIL

@ULHASPATIL เป๊ะ! ฉันพบปัญหาที่คล้ายกันและไม่เข้าใจวิธีแก้ไข คุณพบวิธีแก้ปัญหาสำหรับหน้าจอที่มีนิ้วใกล้เคียงกันและความละเอียดพิกเซลต่างกันหรือไม่?
Georgiy Chebotarev

27

เราต้องการเห็นการเปลี่ยนแปลงของขนาดมุมมองที่ต้องการในหน้าจอต่างๆ

เราจำเป็นต้องสร้างโฟลเดอร์ค่าต่างๆสำหรับหน้าจอต่างๆและใส่ไฟล์ dimens.xml ตามความหนาแน่นของหน้าจอ

ฉันใช้ TextView หนึ่งรายการและสังเกตการเปลี่ยนแปลงเมื่อฉันเปลี่ยน dimens.xml ในโฟลเดอร์ค่าต่างๆ

โปรดทำตามกระบวนการ

ปกติ - xhdpi \ dimens.xml

อุปกรณ์ด้านล่างสามารถเปลี่ยนขนาดของหน้าจอเมื่อเราเปลี่ยนปกติ - 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)

WXGA ขนาด 4.7 นิ้ว (1280 * 720: Xhdpi)

Xlarge - xhdpi \ dimens.xml

อุปกรณ์ด้านล่างนี้สามารถเปลี่ยนขนาดของหน้าจอได้เมื่อเราเปลี่ยน Xlarge - xhdpi \ dimens.xml

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

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

ขนาดใหญ่ - xhdpi \ dimens.xml

อุปกรณ์ด้านล่างนี้สามารถเปลี่ยนขนาดของหน้าจอเมื่อเราเปลี่ยนขนาดใหญ่ - xhdpi \ dimens.xml

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

nexus 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 ปกติ

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

Nexus หนึ่ง (3.7 ", 480 * 800: hdpi)

เล็ก - ldpi \ dimens.xml

อุปกรณ์ด้านล่างนี้สามารถเปลี่ยนขนาดของหน้าจอได้เมื่อเราเปลี่ยนขนาดเล็ก - ldpi \ dimens.xml

2.7 "QVGA Slider (240 * 320: ldpi)

2.7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimens.xml

อุปกรณ์ด้านล่างนี้สามารถเปลี่ยนขนาดของหน้าจอได้เมื่อเราเปลี่ยน xlarge - mdpi \ dimens.xml

10.1 "WXGA (แท็บเล็ต) (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)

ตัวเลื่อน FWVGA ขนาด 3.7 นิ้ว (480 * 854: hdpi)

ปกติ - mdpi \ dimens.xml

อุปกรณ์ด้านล่างสามารถเปลี่ยนขนาดของหน้าจอได้เมื่อเราเปลี่ยนปกติ - mdpi \ dimens.xml

3.2 "HVGA Slider (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
: ที่นี่ห้องสมุดสำหรับการอ้างอิงอยู่SDPและเอสเอส และขอบคุณสำหรับคำตอบที่แม่นยำ!
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)

ฉันจะหาสัดส่วนระหว่างขนาดหน้าจอได้ที่ไหน ขณะที่ผมสามารถมองเห็นในเครื่องมือที่พวกเขากำหนดทุกอย่างในldpi, mdpiลักษณะ
Amit Pal

ซึ่งจะขึ้นอยู่กับโฟลเดอร์ค่าของคุณซึ่งจะถูกดึงกลับมาจากค่ามากที่สุด
Piyush

ฉันจำเป็นต้องพูดถึงvalues-xxhdpiNexus 6 หรือไม่
Amit Pal

ใช่คุณต้องเป็น!
Piyush

320x480เป็นเรื่องปกติmdpi ดังนั้นวางไว้ในvaluesหรือในvalues-mdpi
Phantômaxx

6

คุณสามารถใส่dimens.xmlใน

1) ค่า

2) ค่า -HDpi

3) ค่า xhdpi

4) ค่า xxhdpi

และกำหนดขนาดต่างๆdimens.xmlภายในโฟลเดอร์ที่สอดคล้องกันตามความหนาแน่น


2
ตามเอกสาร Android ขนาดเล็ก / ปกติ / ใหญ่จะเลิกใช้งาน
Benjamin Mesing

1

ในกรณีที่คุณต้องการดูเพิ่มเติม: นี่คือลิงค์สำหรับรายการอุปกรณ์ (แท็บเล็ตมือถือนาฬิกา) รวมถึงwatch , chromebook, และwindows macที่นี่คุณสามารถค้นหาความหนาแน่นขนาดและอื่น ๆ ได้จากที่นี่เป็นแหล่งข้อมูลที่ดีหากคุณใช้โปรแกรมจำลองด้วย

หากคุณคลิกรายการใดรายการหนึ่งรายการนั้นจะแสดงรายละเอียดเพิ่มเติมทางด้านขวา ตัวอย่าง

เนื่องจากเป็นAndroidเช่นนั้นฉันจะโพสต์ที่เกี่ยวข้องกับมัน Sample1

sample2

~ จะดีกว่าถ้าคุณบันทึกสำเนาของเว็บ เพื่อดูแบบออฟไลน์


1

Android 3.2 แนะนำวิธีการใหม่สำหรับขนาดหน้าจอตัวเลขที่อธิบายขนาดหน้าจอทั้งหมดอยู่ในหน่วย "dp" ส่วนใหญ่เราสามารถใช้

ความกว้างที่เล็กที่สุด dp:ความกว้างที่เล็กที่สุดสำหรับโครงร่างแอปพลิเคชันในหน่วย "dp" นี่คือความกว้าง dp ที่เล็กที่สุดที่คุณเคยพบในการหมุนหน้าจอใด ๆ

ในการสร้างคลิกขวาที่res >>> new >>> ไดเรกทอรีทรัพยากร Android

จากหน้าต่างคุณสมบัติที่มีอยู่จะย้ายความกว้างของหน้าจอที่เล็กที่สุดไปยังผู้คัดเลือกที่เลือก

ในหน้าต่างความกว้างของหน้าจอให้เขียนค่า "dp" โดยเริ่มจากที่คุณต้องการให้ Android Studio ใช้การหรี่แสงนั้น

กว่าจะเปลี่ยนเป็นมุมมองโครงการให้คลิกขวาที่ไดเรกทอรีทรัพยากรที่สร้างขึ้นใหม่

ใหม่ >>> ไฟล์ทรัพยากรค่าป้อนชื่อไฟล์ใหม่dimens.xmlและคุณทำเสร็จแล้ว


ขอขอบคุณที่อธิบายวิธีสร้างโฟลเดอร์เหล่านี้จริงๆ
Beko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.