Come definire dimens.xml per ogni diversa dimensione dello schermo in Android?


128

Quando si supportano schermi di diverse dimensioni (densità) in Android, spesso ci si concentra sulla creazione di layout diversi per ogni possibile schermo. IE

  • ldpi
  • MDPI
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Ho progettato un layout per uno schermo xhdpi come riferimento e definito le sue dimensioni in dimens.xml . Ora voglio supportarlo per ogni possibile dimensione dello schermo. Come lo posso fare?

Per quanto ne so, posso usare questo strumento per capire il dimens.xml corretto per altre dimensioni dello schermo e aggiungerlo al mio progetto. È questo il modo giusto di farlo nella mia situazione?

Un'altra domanda, devo solo creare dimens.xml per le dimensioni dello schermo sopra? Se sì, allora cos'è w820dp?

Grazie per l'aiuto. Devo supportare solo telefoni (non tablet o altri dispositivi).


1
Sì, devi creare un dimesn.xmlfile diverso per risoluzioni diverse.
Piyush,

@PiyushGupta Questo sarà per tutti gli schermi sopra dimensionali? Ma cos'è W820dpqualcosa che supporta diverse versioni di Android? Puoi anche suggerirmi qualche tutorial su come supportare schermi diversi sulla base di dimens.xml?
Amit Pal

È per tablet o per altri. Altrimenti, come ho detto, è necessario creare una cartella di valori diversi.
Piyush,

Risposte:


266

Devi creare una cartella con valori diversi per schermate diverse . Piace

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

inserisci qui la descrizione dell'immagine

Per maggiori informazioni puoi visitare qui

Cartelle di valori diversi in Android

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

A cura di @humblerookie

Puoi utilizzare il plug-in Android Studio chiamato Dimenify per generare automaticamente valori di dimensione per altri bucket pixel in base a fattori di scala personalizzati. È ancora in versione beta, assicurati di comunicare eventuali problemi / suggerimenti che incontri allo sviluppatore.


1
non dovrebbero esserci "valori-sw480dp-hdpi" .xhdpi e xxhdpi e così via? solo 320dp hanno questo nella tua risposta .. per favore rispondi
Sharp Edge

2
@IntelliJAmiya: dovresti menzionare la differenza tra Android <= 3.2 e> 3.2.
juergen il

5
@IntelliJAmiya Ho creato un plugin da studio chiamato Dimenify. Ciò consente di creare facilmente dimensioni per altri secchi. Potresti aggiungere una modifica con lo stesso in modo che altri possano utilizzarla? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie

3
Questo Dimenify è un ottimo strumento
Muhammed Refaat,

1
@IntelliJAmiya di sicuro, ci saranno nuove versioni che non saranno coperte in quelle cartelle e / o potrebbero non essere appropriate in certe cartelle.
ralphgabb,

35

Usa DP scalabile

Sebbene teoricamente sia una buona idea creare un layout diverso per schermi di dimensioni diverse, può essere molto difficile adattarsi a tutte le dimensioni dello schermo e densità di pixel. Avere oltre 20 dimens.xmlfile diversi come suggerito nelle risposte sopra, non è affatto facile da gestire.

Come usare:

Per usare sdp:

  1. Includi implementation 'com.intuit.sdp:sdp-android:1.0.5'nel tuo build.gradle,
  2. Sostituisci qualsiasi dpvalore come 50dpcon un @dimen/50_sdpsimile così:

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

Come funziona:

sdpscala con le dimensioni dello schermo perché è essenzialmente un enorme elenco di diversi dimens.xmlper ogni possibile dpvalore.

inserisci qui la descrizione dell'immagine

Guardalo in azione:

Eccolo su tre dispositivi con dimensioni dello schermo e densità molto diverse:

inserisci qui la descrizione dell'immagine

Si noti che il sdpcalcolo dell'unità di dimensioni include alcune approssimazioni dovute a vincoli di prestazioni e usabilità.


Molto obbligato. Questo è stato davvero utile per me.
twenk11k,

@Advait puoi dirmi quale cartella di valori dovrei usare per Samsung Edge 7 con cellulare da 5,5 pollici con risoluzione 2560x1440?
ULHAS PATIL

@Advait attualmente sto usando la cartella valori-xxhdpi ma il problema è che sta prendendo la stessa cartella per 5, 5.5 e 6 schermate nella stessa cartella, quindi c'è lo scorrimento appare su schermi da 5 pollici e 5.5. Non lo voglio. mi può aiutare per favore in questo?
ULHAS PATIL

@Advait S valori-xxhdpi per 5.5 "1080x1920 e anche per 5.5" 1440x2560 Voglio una cartella diversa per 5.5 "1440x2560.
ULHAS PATIL

@ULHASPATIL esattamente! Ho riscontrato un problema simile e non capisco come risolverlo. Hai trovato una soluzione per lo schermo con pollici simili e risoluzione pixel diversa?
Georgiy Chebotarev,

27

vogliamo vedere le modifiche della dimensione della vista richiesta in diverse schermate.

Dobbiamo creare cartelle con valori diversi per schermate diverse e inserire file dimens.xml in base alla densità delle schermate.

Ho preso un TextView e osservato i cambiamenti quando ho cambiato dimens.xml in cartelle con valori diversi.

Si prega di seguire la procedura

normale - xhdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il normale - xhdpi \ dimens.xml

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

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

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

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

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo Xlarge - xhdpi \ dimens.xml

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

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

grande - xhdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il grande - xhdpi \ dimens.xml

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

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

Le schermate seguenti sono visibili in "Cerca telefoni e tablet generici"

large - mdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il grande - mdpi \ dimens.xml

5.1 "WVGA (480 * 800: mdpi)

5.4 "FWVGA (480 * 854: mdpi)

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

normale - hdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il normale - hdpi \ dimens.xml

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

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

piccolo - ldpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il piccolo - ldpi \ dimens.xml

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

2.7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo xlarge - mdpi \ dimens.xml

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

normale - ldpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il normale - ldpi \ dimens.xml

3.3 "WQVGA (240 * 400: LDPI)

3.4 "WQVGA (240 * 432: LDPI)

normale - hdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il normale - hdpi \ dimens.xml

4.0 "WVGA (480 * 800: hdpi)

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

Slider FWVGA da 3,7 "(480 * 854: hdpi)

normale - mdpi \ dimens.xml

I seguenti dispositivi possono cambiare le dimensioni degli schermi quando cambiamo il normale - mdpi \ dimens.xml

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

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


Quindi secondo te le cartelle verrebbero quindi chiamate in modo simile values-normal-xhdpi?
VonSchnauzer,

Sì, sono d'accordo con te, invece di scrivere valori - in tutti i file, ho detto, "crea cartelle di valori diversi per dimensioni di testo diverse". Quindi, per favore, leggi il titolo. Grazie.
Koteswarao,

9

Ci sono belle librerie che gestiranno tutto e ridurranno il tuo dolore. Per usarlo, basta aggiungere due dipendenze in gradle:

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

Successivamente, utilizzare in dimensquesto modo:

        android:layout_marginTop="@dimen/_80sdp"

3
Ecco le librerie di riferimento: SDP e SSP . E grazie per questa risposta precisa!
JorgeAmVF,

7

Ho caricato un semplice programma Java che prende come input il percorso del tuo progetto e il file della dimensione che desideri. Sulla base di ciò, genererebbe il file di dimensioni corrispondente nella console. Ecco il link ad esso:

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

Ecco il codice completo per il riferimento:

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

Devi creare una valuescartella diversa per schermate diverse e inserire il dimens.xmlfile in base alla densità.

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)

Dove posso ottenere la razione tra le dimensioni dello schermo? Come posso vedere nello strumento hanno definito tutto in ldpi, mdpimaniera
Amit Pal

Ciò dipenderà dalla cartella dei valori che ne recupererà al massimo i valori.
Piyush,

Devo menzionare values-xxhdpiNexus 6?
Amit Pal

Sì, devi esserlo!
Piyush,

320x480è tipico mdpi . Quindi, inseriscilo dentro valueso dentrovalues-mdpi
Phantômaxx,

6

Si può mettere dimens.xmlin

1) valori

2) valori-hdpi

3) valori-xhdpi

4) valori-xxhdpi

E dare dimensioni diverse dimens.xmlall'interno delle cartelle corrispondenti in base alla densità.


2
Secondo la documentazione di Android piccola / normale / grande sono obsoleti.
Benjamin Mesing,

1

Nel caso in cui si desidera visualizzare più: Ecco un collegamento per un elenco di dispositivi (tablet, telefoni, orologi), tra cui watch, chromebook, windowse mac. Qui puoi trovare la densità, le dimensioni e così via. Basandoti qui, è una buona risorsa se usi anche un emulatore.

Se fai clic su un elemento specifico, verranno visualizzati ulteriori dettagli sul lato destro. campione

Dal momento che è Android, posterò in relazione ad esso. sample1

sample2

~ È meglio se salvi una copia del web. Per vederlo offline.


1

Android 3.2 introduce un nuovo approccio alle dimensioni dello schermo, i numeri che descrivono le dimensioni dello schermo sono tutti in unità "dp". Principalmente possiamo usare

larghezza minima dp: la larghezza minima disponibile per il layout dell'applicazione in unità "dp"; questa è la larghezza dp più piccola che tu possa mai incontrare in qualsiasi rotazione del display.

Per creare un clic destro su res >>> nuovo >>> Directory risorse Android

Dalla finestra Qualificazioni disponibili spostare Larghezza schermo più piccola a Qualificatori scelti

Nella finestra di larghezza dello schermo basta scrivere il valore "dp" a partire da te se vuoi che Android Studio utilizzi quel dimens.

Quindi passare alla vista Progetto , fare clic con il tasto destro sulla nuova directory di risorse creata

nuovo >>> Valori del file di risorse immettere un nuovo nome di file dimens.xml e il gioco è fatto.


Grazie per aver spiegato come creare effettivamente queste cartelle.
Beko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.