Làm cách nào để xác định dimens.xml cho mọi kích thước màn hình khác nhau trong Android?


128

Khi hỗ trợ các kích thước màn hình khác nhau (mật độ) trong Android thường tập trung vào việc tạo các bố cục khác nhau cho mọi màn hình có thể. I E

  • ldpi
  • mdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Tôi đã thiết kế bố cục cho màn hình xhdpi làm tham chiếu và xác định kích thước của nó trong dimens.xml . Bây giờ tôi muốn hỗ trợ nó cho mọi kích thước màn hình có thể. Làm thế nào tôi có thể làm điều đó?

Theo như tôi biết, tôi có thể sử dụng công cụ này để tìm ra dimens.xml thích hợp cho các kích thước màn hình khác và thêm nó vào dự án của tôi. Đây có phải là cách đúng đắn để làm điều đó trong tình huống của tôi?

Một câu hỏi khác, tôi chỉ cần tạo dimens.xml cho kích thước màn hình ở trên? Nếu có thì là w820dpgì?

Cảm ơn bạn đã giúp đỡ. Tôi chỉ cần hỗ trợ điện thoại (không phải máy tính bảng hoặc các thiết bị khác).


1
Có, bạn phải tạo một dimesn.xmltệp khác nhau cho các độ phân giải khác nhau.
Piyush

@PiyushGupta Điều đó sẽ cho tất cả các màn hình trên? Nhưng W820dpnó là cái gì đó hỗ trợ phiên bản Android khác nhau? Ngoài ra, bạn có thể gợi ý cho tôi bất kỳ hướng dẫn nào về việc hỗ trợ màn hình khác nhau trên cơ sở dimens.xml không?
Amit Pal

Nó là cho máy tính bảng hoặc cho người khác. Mặt khác như tôi đã nói, bạn cần tạo một thư mục giá trị khác.
Piyush

Câu trả lời:


266

Bạn phải tạo thư mục giá trị khác nhau cho các màn hình khác nhau . Giống

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

nhập mô tả hình ảnh ở đây

Để biết thêm thông tin bạn có thể truy cập tại đây

Các thư mục giá trị khác nhau trong Android

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

Được chỉnh sửa bởi @humblerookie

Bạn có thể sử dụng plugin Android Studio có tên Dimenify để tự động tạo giá trị thứ nguyên cho các nhóm pixel khác dựa trên các yếu tố tỷ lệ tùy chỉnh. Nó vẫn đang trong giai đoạn thử nghiệm, hãy chắc chắn thông báo bất kỳ vấn đề / đề xuất nào bạn gặp phải cho nhà phát triển.


1
không nên có "giá trị-sw480dp-hdpi" .xhdpi và xxhdpi, v.v. chỉ có 320dp có câu trả lời như vậy .. vui lòng trả lời
Sharp Edge

2
@IntelliJAmiya: Bạn nên đề cập đến sự khác biệt giữa Android <= 3.2 và> 3.2.
juergen d

5
@IntelliJAmiya Tôi đã tạo một plugin studio có tên Dimenify. Điều này cho phép bạn tạo kích thước cho các thùng khác một cách dễ dàng. Bạn có thể thêm một chỉnh sửa với cùng để người khác có thể sử dụng nó? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie

3
Dimenify này là một công cụ tuyệt vời
Muhammed Refaat

1
@IntelliJAmiya chắc chắn, sẽ có những bản phát hành mới sẽ không được đề cập trong các thư mục đó và / hoặc có thể không phù hợp trên một thư mục nhất định.
ralphgabb

35

Sử dụng DP có thể mở rộng

Mặc dù thực hiện bố cục khác nhau cho các kích thước màn hình khác nhau về mặt lý thuyết là một ý tưởng tốt, nhưng có thể rất khó để phù hợp với tất cả các kích thước màn hình và mật độ pixel. Có hơn 20 dimens.xmltệp khác nhau như được đề xuất trong các câu trả lời ở trên, không dễ để quản lý.

Cách sử dụng:

Để sử dụng sdp:

  1. Bao gồm implementation 'com.intuit.sdp:sdp-android:1.0.5'trong build.gradle,
  2. Thay thế bất kỳ dpgiá trị nào, chẳng hạn như 50dpbằng @dimen/50_sdp:

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

Làm thế nào nó hoạt động:

sdpchia tỷ lệ với kích thước màn hình vì về cơ bản nó là một danh sách lớn khác nhau dimens.xmlcho mọi dpgiá trị có thể .

nhập mô tả hình ảnh ở đây

Xem nó trong hành động:

Đây là trên ba thiết bị có kích thước màn hình và mật độ khác nhau rộng rãi:

nhập mô tả hình ảnh ở đây

Lưu ý rằng sdptính toán đơn vị kích thước bao gồm một số xấp xỉ do một số hạn chế về hiệu suất và khả năng sử dụng.


Nhiều nghĩa vụ. Điều này thực sự hữu ích cho tôi.
twenk11k

@Advait bạn có thể vui lòng cho tôi biết nên sử dụng thư mục giá trị nào cho Samsung Edge 7 với thiết bị di động 5,5 inch với độ phân giải 2560x1440 không?
CUỐI CÙNG ULHAS

@Advait hiện tại tôi đang sử dụng thư mục value-xxhdpi nhưng vấn đề là, nó đang lấy cùng một thư mục cho các màn hình 5, 5.5 & 6 cùng một thư mục để có cuộn xuất hiện trên màn hình 5 inch & 5.5. Tôi không muốn điều đó. bạn có thể vui lòng giúp tôi trong việc này?
CUỐI CÙNG ULHAS

@Advait S value-xxhdpi cho 5,5 "1080x1920 & Cũng cho 5,5" 1440x2560 Tôi muốn thư mục khác cho 5,5 "1440x2560.
ULHAS PATIL

@ULHASPATIL chính xác! Tôi gặp vấn đề tương tự và không hiểu làm thế nào để giải quyết nó. Bạn đã tìm thấy bất kỳ giải pháp cho màn hình với inch tương tự và độ phân giải pixel khác nhau?
Georgiy Chebotarev

27

chúng tôi muốn xem những thay đổi của kích thước chế độ xem được yêu cầu trong các màn hình khác nhau.

Chúng ta cần tạo một thư mục giá trị khác nhau cho các màn hình khác nhau và đặt tệp dimens.xml dựa trên mật độ màn hình.

Tôi đã lấy một TextView và quan sát các thay đổi khi tôi thay đổi dimens.xml trong các thư mục giá trị khác nhau.

Hãy làm theo quy trình

bình thường - xhdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi bình thường - 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)

Thiên hà (4,7 ", 720 * 1280: xhdpi)

4,65 "720p (720 * 1280: xhdpi)

4,7 "WXGA (1280 * 720: Xhdpi)

Xlarge - xhdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi Xlarge - xhdpi \ dimens.xml

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

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

lớn - xhdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi - xhdpi \ dimens.xml lớn

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

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

Các màn hình dưới đây được hiển thị trong "Tìm kiếm điện thoại và máy tính bảng chung"

lớn - mdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi lớn - mdpi \ dimens.xml

5,1 "WVGA (480 * 800: mdpi)

5,4 "FWVGA (480 * 854: mdpi)

7.0 "WSVGA (Máy tính bảng) (1024 * 600: mdpi)

bình thường - hdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng ta thay đổi bình thường - hdpi \ dimens.xml

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

nexus một (3.7 ", 480 * 800: hdpi)

nhỏ - ldpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi nhỏ - ldpi \ dimens.xml

Thanh trượt QVGA 2.7 "(240 * 320: ldpi)

2,7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước của màn hình khi chúng tôi thay đổi xlarge - mdpi \ dimens.xml

10,1 "WXGA (tABLET) (1280 * 800: MDPI)

bình thường - ldpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng ta thay đổi bình thường - ldpi \ dimens.xml

3,3 "WQVGA (240 * 400: LDPI)

3,4 "WQVGA (240 * 432: LDPI)

bình thường - hdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng ta thay đổi bình thường - hdpi \ dimens.xml

4.0 "WVGA (480 * 800: hdpi)

3,7 "WVGA (480 * 800: hdpi)

Thanh trượt 3.7 "FWVGA (480 * 854: hdpi)

bình thường - mdpi \ dimens.xml

Các thiết bị bên dưới có thể thay đổi kích thước màn hình khi chúng tôi thay đổi bình thường - mdpi \ dimens.xml

3.2 "Thanh trượt HVGA (ADP1) (320 * 480: MDPI)

3,2 "QVGA (ADP2) (320 * 480: MDPI)


Vì vậy, theo bạn các thư mục sau đó sẽ được đặt tên như thế values-normal-xhdpinào?
VonSchnauzer

Có, tôi đồng ý với bạn, thay vì ghi giá trị - vào tất cả các tệp, tôi nói, "tạo các thư mục giá trị khác nhau cho các kích cỡ văn bản khác nhau". Vì vậy, vui lòng đọc tiêu đề. Cảm ơn.
koteswarao

9

Có những thư viện đẹp sẽ xử lý mọi thứ và giảm bớt nỗi đau của bạn. Để sử dụng nó, chỉ cần thêm hai phụ thuộc trong lớp:

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

Sau đó, sử dụng dimensnhư thế này:

        android:layout_marginTop="@dimen/_80sdp"

3
Dưới đây là các thư viện để tham khảo: SDPSSP . Và cảm ơn vì câu trả lời chính xác này!
JorgeAmVF

7

Tôi đã tải lên một chương trình java đơn giản lấy vị trí dự án của bạn và tệp thứ nguyên bạn muốn làm đầu vào. Dựa vào đó, nó sẽ xuất ra tệp kích thước tương ứng trong bàn điều khiển. Đây là liên kết đến nó:

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

Đây là mã đầy đủ để tham khảo:

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

Bạn phải tạo một valuesthư mục khác cho các màn hình khác nhau và đặt dimens.xmltệp theo mật độ.

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)

Tôi có thể lấy khẩu phần ở giữa kích thước màn hình ở đâu? Như tôi đã có thể thấy trong các công cụ mà họ định nghĩa tất cả mọi thứ trong ldpi, mdpicách
Amit Pal

Điều đó sẽ phụ thuộc vào thư mục giá trị của bạn, đó sẽ là các giá trị truy xuất nhiều nhất từ ​​nó.
Piyush

Tôi có cần đề cập đến values-xxhdpiNexus 6 không?
Amit Pal

Có bạn cần phải có!
Piyush

320x480mdpi điển hình . Vì vậy, hãy đặt nó vào valueshoặc trongvalues-mdpi
Phantômaxx

6

Bạn có thể đặt dimens.xmltrong

1) giá trị

2) giá trị-hdpi

3) giá trị-xhdpi

4) giá trị-xxhdpi

Và cung cấp kích thước khác nhau trong dimens.xmlcác thư mục tương ứng theo mật độ.


2
Theo tài liệu Android nhỏ / bình thường / lớn không được chấp nhận.
Benjamin Mesing

1

Trong trường hợp bạn muốn xem thêm: Dưới đây là một liên kết cho một danh sách các thiết bị (tablet, điện thoại di động, đồng hồ), bao gồm watch, chromebook, windowsmac. Ở đây bạn có thể tìm thấy mật độ, kích thước, v.v. Chỉ cần dựa vào đây, đây cũng là một tài nguyên tốt nếu bạn sử dụng trình giả lập.

Nếu bạn bấm vào một mục cụ thể, nó sẽ hiển thị thêm chi tiết ở phía bên phải. mẫu vật

Vì nó Android, tôi sẽ đăng liên quan đến nó. mẫu1

mẫu2

~ Sẽ tốt hơn nếu bạn lưu một bản sao của web. Để xem ngoại tuyến.


1

Android 3.2 giới thiệu một cách tiếp cận mới về kích thước màn hình, các con số mô tả kích thước màn hình đều có trong các đơn vị Dpiên. Hầu hết chúng ta có thể sử dụng

chiều rộng nhỏ nhất dp: chiều rộng nhỏ nhất có sẵn để bố trí ứng dụng trong các đơn vị dpv đây là chiều rộng nhỏ nhất dp mà bạn sẽ gặp trong bất kỳ vòng quay nào của màn hình.

Để tạo một nhấp chuột phải vào res >>> mới >>> thư mục tài nguyên Android

Từ cửa sổ vòng loại có sẵn di chuyển Chiều rộng màn hình nhỏ nhất sang vòng loại được chọn

Trong chiều rộng màn hình cửa sổ chỉ cần viết giá trị "dp" bắt đầu từ bạn muốn Android Studio sử dụng độ mờ đó.

Thay đổi thành dạng xem dự án , nhấp chuột phải vào thư mục tài nguyên đã tạo mới của bạn

mới >>> Giá trị tệp tài nguyên nhập tên tệp mới dimens.xml và bạn đã hoàn tất.


Cảm ơn đã giải thích về cách thực sự tạo ra các thư mục này.
Beko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.