Comment définir dimens.xml pour chaque taille d'écran différente dans Android?

128

Lors de la prise en charge de différentes tailles d'écran (densités) dans Android, l'accent est souvent mis sur la création de mises en page différentes pour chaque écran possible. C'EST À DIRE

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

J'ai conçu une mise en page pour un écran xhdpi comme référence et défini ses dimensions dans dimens.xml . Maintenant, je veux le soutenir pour toutes les tailles d'écran possibles. Comment puis je faire ça?

Pour autant que je sache, je peux utiliser cet outil pour déterminer le dimens.xml approprié pour d'autres tailles d'écran et l'ajouter à mon projet. Est-ce la bonne façon de procéder dans ma situation?

Une autre question, dois-je seulement créer dimens.xml pour les dimensions d'écran ci-dessus? Si oui, qu'est-ce que c'est w820dp?

Merci de votre aide. Je dois uniquement prendre en charge les téléphones (pas les tablettes ou autres appareils).

Amit Pal
la source
1
Oui, vous devez créer des dimesn.xmlfichiers différents pour différentes résolutions.
Piyush
@PiyushGupta Ce sera pour tout l'écran dimensionnel ci-dessus? Mais qu'est-ce que W820dpc'est quelque chose qui prend en charge une version Android différente? Pouvez-vous également me suggérer un tutoriel sur la prise en charge de différents écrans sur la base de dimens.xml?
Amit Pal
C'est pour tablette ou pour d'autres. Sinon, comme je l'ai dit, vous devez créer un dossier de valeurs différentes.
Piyush

Réponses:

266

Vous devez créer un dossier de valeurs différentes pour différents écrans . Comme

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

entrez la description de l'image ici

Pour plus d'informations, vous pouvez visiter ici

Différents dossiers de valeurs dans Android

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

Édité par @humblerookie

Vous pouvez utiliser le plug-in Android Studio appelé Dimenify pour générer automatiquement des valeurs de dimension pour d'autres ensembles de pixels en fonction de facteurs d'échelle personnalisés. Il est toujours en version bêta, assurez-vous de notifier tout problème / suggestion que vous rencontrez au développeur.

IntelliJ Amiya
la source
1
ne devrait-il pas y avoir "values-sw480dp-hdpi" .xhdpi et xxhdpi et ainsi de suite? seulement 320dp en ont dans votre réponse .. s'il vous plaît répondre
Sharp Edge
2
@IntelliJAmiya: Vous devez mentionner la différence entre Android <= 3.2 et> 3.2.
juergen d
5
@IntelliJAmiya J'ai créé un plugin de studio appelé Dimenify. Cela vous permet de créer facilement des dimensions pour d'autres compartiments. Pourriez-vous ajouter une modification avec le même afin que d'autres puissent l'utiliser? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie
3
Ce Dimenify est un excellent outil
Muhammed Refaat
1
@IntelliJAmiya bien sûr, il y aura de nouvelles versions qui ne seront pas couvertes sur ces dossiers et / ou peuvent ne pas être appropriées sur certains dossiers.
ralphgabb
35

Utilisez DP évolutif

Bien que créer une mise en page différente pour différentes tailles d'écran soit théoriquement une bonne idée, cela peut devenir très difficile à adapter pour toutes les dimensions d'écran et toutes les densités de pixels. Avoir plus de 20 dimens.xmlfichiers différents , comme suggéré dans les réponses ci-dessus, n'est pas du tout facile à gérer.

Comment utiliser:

À utiliser sdp:

  1. Inclure implementation 'com.intuit.sdp:sdp-android:1.0.5'dans votre build.gradle,
  2. Remplacez toute dpvaleur telle que 50dppar une valeur @dimen/50_sdpsimilaire:

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

Comment ça fonctionne:

sdps'adapte à la taille de l'écran car il s'agit essentiellement d'une énorme liste de différents dimens.xmlpour chaque dpvaleur possible .

entrez la description de l'image ici

Regardez-le en action:

Le voici sur trois appareils avec des dimensions d'écran et des densités très différentes:

entrez la description de l'image ici

Notez que le sdpcalcul de l'unité de taille inclut une certaine approximation en raison de certaines contraintes de performances et d'utilisabilité.

Advait S
la source
Infiniment reconnaissant. Cela a été vraiment utile pour moi.
twenk11k
@Advait pouvez-vous me dire quel dossier de valeurs dois-je utiliser pour Samsung Edge 7 avec un mobile de 5,5 pouces avec une résolution de 2560x1440?
ULHAS PATIL
@Advait actuellement j'utilise le dossier values-xxhdpi mais le problème est qu'il prend le même dossier pour les écrans 5, 5.5 et 6 même dossier donc il y a un défilement apparaît sur les écrans 5 pouces et 5.5. Je ne veux pas de ça. pouvez-vous s'il vous plaît m'aider dans ce domaine?
ULHAS PATIL
@Advait S values-xxhdpi pour 5,5 "1080x1920 et aussi pour 5,5" 1440x2560 Je veux un dossier différent pour 5,5 "1440x2560.
ULHAS PATIL
@ULHASPATIL exactement! J'ai rencontré un problème similaire et je ne comprends pas comment le résoudre. Avez-vous trouvé une solution pour un écran avec des pouces similaires et une résolution de pixels différente?
Georgiy Chebotarev le
27

nous voulons voir les changements de taille de vue requise dans différents écrans.

Nous devons créer des dossiers de valeurs différentes pour différents écrans et placer le fichier dimens.xml en fonction des densités d'écran.

J'ai pris un TextView et observé les changements lorsque j'ai changé dimens.xml dans différents dossiers de valeurs.

Veuillez suivre le processus

normal - xhdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons la 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 (1 280 * 720: Xhdpi)

Xlarge - xhdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons le Xlarge - xhdpi \ dimens.xml

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

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

grand - xhdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons le grand - xhdpi \ dimens.xml

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

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

Les écrans ci-dessous sont visibles dans "Rechercher des téléphones et tablettes génériques"

grand - mdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons le grand - mdpi \ dimens.xml

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

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

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

normal - hdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons la normale - hdpi \ dimens.xml

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

nexus one (3,7 ", 480 * 800: hdpi)

petit - ldpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons le petit - ldpi \ dimens.xml

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

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

xlarge - mdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons le xlarge - mdpi \ dimens.xml

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

normal - ldpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons la normale - ldpi \ dimens.xml

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

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

normal - hdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons la normale - hdpi \ dimens.xml

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

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

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

normal - mdpi \ dimens.xml

Les appareils ci-dessous peuvent changer la taille des écrans lorsque nous changeons la normale - mdpi \ dimens.xml

Curseur HVGA 3,2 "(ADP1) (320 * 480: MDPI)

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

koteswarao
la source
Donc, selon vous, les dossiers seraient alors nommés quelque chose comme values-normal-xhdpi?
VonSchnauzer
Oui, je suis d'accord avec vous, au lieu d'écrire des valeurs - à tous les fichiers, j'ai dit, "créer des dossiers de valeurs différentes pour différentes tailles de texte". Veuillez donc lire le titre. Merci.
koteswarao
9

Il existe de belles bibliothèques qui gèrent tout et réduisent votre douleur. Pour l'utiliser, ajoutez simplement deux dépendances dans gradle:

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

Après cela, utilisez dimenscomme ceci:

        android:layout_marginTop="@dimen/_80sdp"
Shivam Yadav
la source
3
Voici les bibliothèques de référence: SDP et SSP . Et merci pour cette réponse précise!
JorgeAmVF
7

J'ai téléchargé un programme java simple qui prend l'emplacement de votre projet et le fichier de dimension que vous souhaitez en entrée. Sur cette base, il afficherait le fichier de dimension correspondant dans la console. Voici le lien vers celui-ci:

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

Voici le code complet pour la référence:

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
la source
6

Vous devez créer un valuesdossier différent pour différents écrans et mettre le dimens.xmlfichier en fonction des densités.

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
la source
Où puis-je obtenir la ration entre la taille de l'écran? Comme je peux voir dans l'outil ils ont défini tout ldpi, de mdpimanière
Amit Pal
Cela dépendra de votre dossier de valeurs qui en extraira au plus les valeurs.
Piyush
Dois-je mentionner values-xxhdpipour Nexus 6?
Amit Pal
Oui, vous devez l'être!
Piyush
320x480est typique mdpi . Alors, mettez-le dans valuesou dansvalues-mdpi
Phantômaxx
6

Vous pouvez mettre dimens.xmlen

1) valeurs

2) valeurs-hdpi

3) valeurs-xhdpi

4) valeurs-xxhdpi

Et donnez différentes tailles dimens.xmldans les dossiers correspondants en fonction des densités.

Anoop M
la source
2
Selon la documentation Android, les petites / normales / grandes sont obsolètes.
Benjamin Mesing
1

Si vous voulez voir plus: Voici un lien pour une liste des périphériques (tablettes, mobiles, montres), y compris watch, chromebook, windowset mac. Ici vous pouvez trouver la densité, les dimensions, etc. En vous basant simplement ici, c'est une bonne ressource si vous utilisez également un émulateur.

Si vous cliquez sur un élément spécifique, il affichera plus de détails sur le côté droit. échantillon

Puisqu'il est Android, je posterai lié à lui. échantillon1

échantillon2

~ Il vaut mieux enregistrer une copie du Web. Pour l'afficher hors ligne.

RoCk RoCk
la source
1

Android 3.2 introduit une nouvelle approche des tailles d'écran, les nombres décrivant la taille de l'écran sont tous en unités «dp».

plus petite largeur dp: la plus petite largeur disponible pour la mise en page de l'application en unités «dp»; c'est le plus petit dp de largeur que vous rencontrerez jamais dans une rotation de l'écran.

Pour créer un clic droit sur res >>> nouveau >>> répertoire de ressources Android

De la fenêtre des qualificatifs disponibles , déplacez la plus petite largeur d'écran vers les qualificatifs choisis

Dans la fenêtre Largeur de l' écran, écrivez simplement la valeur «dp» à partir de laquelle vous souhaitez qu'Android Studio utilise cette dimensionnement.

Ensuite, passez à la vue Projet , faites un clic droit sur votre nouveau répertoire de ressources créé

nouveau fichier de ressources >>> Valeurs entrez un nouveau nom de fichier dimens.xml et vous avez terminé.

Levon Petrosyan
la source
Merci d'avoir expliqué comment créer ces dossiers.
Beko