Jak zdefiniować plik dimens.xml dla każdego rozmiaru ekranu w systemie Android?

141

Obsługując różne rozmiary (gęstości) ekranu w systemie Android, często koncentruje się na tworzeniu różnych układów dla każdego możliwego ekranu. TO ZNACZY

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

Zaprojektowałem układ ekranu xhdpi jako odniesienie i zdefiniowałem jego wymiary w dimens.xml . Teraz chcę wspierać go przy każdym możliwym rozmiarze ekranu. Jak mogę to zrobić?

O ile wiem, mogę użyć tego narzędzia, aby znaleźć odpowiedni plik dimens.xml dla innych rozmiarów ekranu i dodać go do mojego projektu. Czy to właściwy sposób, aby to zrobić w mojej sytuacji?

Kolejne pytanie, czy muszę utworzyć plik dimens.xml tylko dla powyższych wymiarów ekranu? Jeśli tak, to co jest w820dp?

Dzięki za pomoc. Muszę obsługiwać tylko telefony (nie tablety ani inne urządzenia).

Amit Pal
źródło
1
Tak, musisz utworzyć inne dimesn.xmlpliki dla różnych rozdzielczości.
Piyush
@PiyushGupta To będzie dla wszystkich ponadwymiarowych ekranów? Ale co to W820dpjest coś, co obsługuje różne wersje Androida? Czy możesz też zasugerować jakiś poradnik dotyczący obsługi różnych ekranów w oparciu o dimens.xml?
Amit Pal
To jest dla tabletu lub dla innych. W przeciwnym razie, jak powiedziałem, musisz utworzyć inny folder wartości.
Piyush

Odpowiedzi:

283

Musisz utworzyć folder Różne wartości dla różnych ekranów . Lubić

values-sw720dp          10.1tablet 1280x800 mdpi

values-sw600dp          7.0tablet 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

wprowadź opis obrazu tutaj

Więcej informacji można znaleźć tutaj

Różne foldery wartości w systemie Android

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

Edytowane przez @humblerookie

Możesz skorzystać z wtyczki Android Studio o nazwie Dimenify, aby automatycznie generować wartości wymiarów dla innych grup pikseli w oparciu o niestandardowe współczynniki skali. Jest nadal w wersji beta, pamiętaj o powiadomieniu programisty o wszelkich napotkanych problemach / sugestiach.

IntelliJ Amiya
źródło
1
czy nie powinno być „wartości-sw480dp-hdpi” .xhdpi i xxhdpi i tak dalej? tylko 320dp ma takie w swojej odpowiedzi .. proszę o odpowiedź
Sharp Edge
2
@IntelliJAmiya: Należy wspomnieć o różnicy między Androidem <= 3.2 a> 3.2.
juergen d
5
@IntelliJAmiya Stworzyłem wtyczkę do studia o nazwie Dimenify. Pozwala to łatwo tworzyć wymiary dla innych segmentów. Czy możesz dodać zmianę z tą samą zmianą, aby inni mogli z niej skorzystać? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie
3
Ten Dimenify to świetne narzędzie
Muhammed Refaat
1
@IntelliJAmiya na pewno pojawią się nowe wydania, które nie będą objęte tymi folderami i / lub mogą nie być odpowiednie w niektórych folderach.
ralphgabb
39

Użyj skalowalnego DP

Chociaż utworzenie innego układu dla różnych rozmiarów ekranu jest teoretycznie dobrym pomysłem, dostosowanie go do wszystkich wymiarów ekranu i gęstości pikseli może być bardzo trudne . Posiadanie ponad 20 różnych dimens.xmlplików, jak sugerują powyższe odpowiedzi, wcale nie jest łatwe w zarządzaniu.

Jak używać:

Do użycia sdp:

  1. Obejmują implementation 'com.intuit.sdp:sdp-android:1.0.5'w twojej build.gradle,
  2. Wymień żadnej dpwartości, takie jak 50dpz @dimen/50_sdptak:

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

Jak to działa:

sdpskaluje się z rozmiarem ekranu, ponieważ jest to zasadniczo ogromna lista różnych dimens.xmldla każdej możliwej dpwartości.

wprowadź opis obrazu tutaj

Zobacz to w akcji:

Tutaj jest na trzech urządzeniach o bardzo różnych wymiarach ekranu i gęstościach:

wprowadź opis obrazu tutaj

Należy zauważyć, że sdpobliczenia jednostki rozmiaru obejmują pewne przybliżenia ze względu na pewne ograniczenia dotyczące wydajności i użyteczności.

Advait S
źródło
1
Bardzo zobowiązany. To było dla mnie naprawdę przydatne.
twenk11k
@Advait, czy możesz mi powiedzieć, którego folderu wartości powinienem użyć dla telefonu Samsung Edge 7 z telefonem komórkowym 5,5 cala i rozdzielczością 2560x1440?
ULHAS PATIL
@Advait obecnie używam folderu values-xxhdpi, ale problem polega na tym, że bierze ten sam folder dla ekranów 5, 5,5 i 6 w tym samym folderze, więc na ekranach 5 cali i 5,5 pojawia się przewijanie. Nie chcę tego. czy możesz mi w tym pomóc?
ULHAS PATIL
@Advait S values-xxhdpi dla 5,5 "1080x1920 & Również dla 5,5" 1440x2560 Chcę inny folder dla 5,5 "1440x2560.
ULHAS PATIL
@ULHASPATIL dokładnie! Napotkałem podobny problem i nie rozumiem, jak go rozwiązać. Czy znalazłeś jakieś rozwiązanie dla ekranu o podobnych calach i różnej rozdzielczości pikseli?
Georgiy Chebotarev
27

Chcemy zobaczyć zmiany wymaganego rozmiaru widoku na różnych ekranach.

Musimy utworzyć różne foldery wartości dla różnych ekranów i umieścić plik dimens.xml na podstawie gęstości ekranu.

Zrobiłem jeden TextView i zaobserwowałem zmiany, gdy zmieniłem dimens.xml w różnych folderach wartości.

Postępuj zgodnie z procesem

normal - xhdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy normalny - xhdpi \ dimens.xml

Nexus 5X (5,2 "* 1080 * 1920: 420 dpi)

nexus 6P (5,7 cala * 1440 * 2560: 560 dpi)

nexus 6 (6,0 "* 1440 * 2560: 560 dpi)

nexus 5 (5,0 cala , 1080 1920: xxhdpi)

Nexus 4 (4,7 cala, 768 * 1280: xhdpi)

Galaxy Nexus (4,7 cala, 720 * 1280: xhdpi)

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

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

Xlarge - xhdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy Xlarge - xhdpi \ dimens.xml

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

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

duży - xhdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy duży - xhdpi \ dimens.xml

Nexus 7 (7,0 ", 1200 * 1920: xhdpi)

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

Poniższe ekrany są widoczne w sekcji „Wyszukaj ogólne telefony i tablety”

duży - mdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy duży - mdpi \ dimens.xml

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

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

7,0 "WSVGA (tablet) (1024 * 600: mdpi)

normalny - hdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy normalny - hdpi \ dimens.xml

nexus s (4,0 ", 480 * 800: hdpi)

Nexus One (3,7 cala, 480 * 800: HDpi)

small - ldpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmieniamy small - ldpi \ dimens.xml

2,7-calowy suwak QVGA (240 * 320: ldpi)

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

xlarge - mdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy xlarge - mdpi \ dimens.xml

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

normal - ldpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy normalny - ldpi \ dimens.xml

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

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

normalny - hdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy normalny - hdpi \ dimens.xml

4,0 "WVGA (480 * 800: hdpi)

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

3,7-calowy suwak FWVGA (480 * 854: hdpi)

normal - mdpi \ dimens.xml

Poniższe urządzenia mogą zmieniać rozmiary ekranów, gdy zmienimy normalny - mdpi \ dimens.xml

3,2-calowy suwak HVGA (ADP1) (320 * 480: MDPI)

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

koteswarao
źródło
Więc według ciebie foldery miałyby wtedy nazwę w stylu values-normal-xhdpi?
VonSchnauzer
Tak, zgadzam się z tobą, zamiast zapisywać wartości - do wszystkich plików powiedziałem, "utwórz różne foldery wartości dla różnych rozmiarów tekstu". Przeczytaj więc tytuł. Dzięki.
koteswarao
11

Są fajne biblioteki, które zajmą się wszystkim i zmniejszą twój ból. Aby go użyć, po prostu dodaj dwie zależności w gradle:

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

Następnie użyj w dimensten sposób:

        android:layout_marginTop="@dimen/_80sdp"
Shivam Yadav
źródło
3
Oto biblioteki w celach informacyjnych: SDP i SSP . Dziękuję za tę precyzyjną odpowiedź!
JorgeAmVF
To również nie jest idealne według aktualnego czasu 2020
Kishan Solanki
7

Wgrałem prosty program java, który pobiera lokalizację twojego projektu i plik wymiarów, który chcesz jako dane wejściowe. Na tej podstawie wyprowadzi odpowiedni plik wymiarów w konsoli. Oto link do tego:

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

Oto pełny kod odniesienia:

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);
    }
}
Akeshwar Jha
źródło
6

Musisz utworzyć inny valuesfolder dla różnych ekranów i umieścić dimens.xmlplik według gęstości.

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)
Piyush
źródło
Gdzie mogę uzyskać porcję między rozmiarem ekranu? Jak widzę w narzędziu one zdefiniowane wszystko ldpi, mdpisposób
Amit Pal
Zależy to od twojego folderu wartości, z którego będą pobierane wartości co najwyżej.
Piyush
Czy muszę wspomnieć values-xxhdpio Nexusie 6?
Amit Pal
Tak, musisz być!
Piyush
320x480jest typowym mdpi . Więc umieść to w valueslub wvalues-mdpi
Phantômaxx
6

Możesz włożyć dimens.xml w

1) wartości

2) wartości-hdpi

3) wartości-xhdpi

4) wartości-xxhdpi

I podaj różne rozmiary w dimens.xmlodpowiednich folderach zgodnie z gęstością.

Anoop M.
źródło
2
Zgodnie z dokumentacją Androida small / normal / large są przestarzałe.
Benjamin Mesing
1

W przypadku, gdy chcesz zobaczyć więcej: Oto Link do listy urządzeń (tablet, telefony, zegarki), w tym watch, chromebook, windowsi mac. Tutaj możesz znaleźć gęstość, wymiary itp. Po prostu umieść to tutaj, jest to dobre źródło, jeśli używasz również emulatora.

Jeśli klikniesz określony element, po prawej stronie pokaże się więcej szczegółów. próba

Ponieważ jest Android, napiszę o tym związany. próbka1

próbka2

~ Lepiej, jeśli zapiszesz kopię sieci. Aby wyświetlić to w trybie offline.

RoCk RoCk
źródło
1

Android 3.2 wprowadza nowe podejście do rozmiarów ekranu, wszystkie liczby opisujące rozmiar ekranu są podane w jednostkach „dp”. Najczęściej możemy użyć

najmniejsza szerokość dp: najmniejsza szerokość dostępna dla układu aplikacji w jednostkach „dp”; jest to najmniejsza szerokość dp, jaką kiedykolwiek napotkasz przy dowolnym obrocie wyświetlacza.

Aby utworzyć jeden prawym przyciskiem myszy res >>> nowy >>> katalog zasobów Androida

Z okna Dostępne kwalifikatory przenieś najmniejszą szerokość ekranu do wybranych kwalifikatorów

W szerokości ekranu oknie po prostu wpisz wartość „dp” zaczynając od tego, czy chcesz, aby Android Studio używał tych wymiarów.

Następnie przejdź do widoku projektu , kliknij prawym przyciskiem myszy nowo utworzony katalog zasobów

nowy >>> Plik zasobów wartości wprowadź nową nazwę pliku dimens.xml i gotowe.

Levon Petrosyan
źródło
Dziękujemy za wyjaśnienie, jak właściwie utworzyć te foldery.
Beko