web-dev-qa-db-fra.com

Comment configurer la mise en page Android pour prendre en charge toutes les tailles d'écran?

Je développe un programme sur Android version2.2. J'ai lu de nombreux documents sur la prise en charge de plusieurs tailles d'écran mais toujours confus. J'ai conçu un fichier de mise en page, qui prend en charge les grands écrans et les écrans normaux. Lorsque je l'essaie avec un petit écran, il ne modifie pas la mise en page pour l'adapter à l'écran. J'ai aussi utilisé ce code dans le manifeste. 

<supports-screens 
        Android:resizeable="true"
        Android:smallScreens="true"
        Android:normalScreens="true"
        Android:largeScreens="true"
        Android:anyDensity="true"
        />

L'image pour le petit écran est ici. Comment configurer un écran compatible avec le petit écran? J'ai trouvé quelque part quelque part en utilisant le dossier "layout-small", mais si j'utilise ceci, la taille du projet augmente, je ne le souhaite pas. Quelqu'un peut-il me suggérer le meilleur moyen de procéder?

20
wolverine

Veuillez passer par les liens suivants. Ceux-ci pourraient vous aider:

Prise en charge de différentes tailles d'écran

Prise en charge de plusieurs écrans

Soutenir des densités différentes

Tablettes et combinés compatibles

Autant que je sache, la seule façon de prendre en charge tous les écrans consiste à bifurcer ce dossier. Chaque fichier XML peut aller jusqu'à quelques kilo octets. La taille ne devrait donc pas être un problème en tant que tel. 

17
Ghost

Solution pour tous les écrans et supporte tous les layout.

                  ldpi     mdpi     hdpi     xhdpi     xxhdpi     xxxhdpi
ic_launcher      36x36    48x48    72x72     96x96     144x144    192x192
Notification     18x18    24x24    36x36     48x48     72x72       96x96 
Action Bar & Tab 24*24    32*32    48*48     64*64     96*96      128*128
Background      240x320  320x480  480x800   720x1280   1080x1920  1440X2560

Dossier dessinable:

res/drawable        (default)
res/drawable-ldpi/  (240x320 and nearer resolution)
res/drawable-mdpi/  (320x480 and nearer resolution)
res/drawable-hdpi/  (480x800, 540x960 and nearer resolution)
res/drawable-xhdpi/  (720x1280 - Samsung S3, Micromax Canvas HD etc)
res/drawable-xxhdpi/ (1080x1920 - Samsung S4, HTC one, Nexus 5, etc)
res/drawable-xxxhdpi/ (1440X2560 - Nexus 6,Samsung S6Edge).


ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi

Disposition:

layout-large-mdpi   (1024x600)
layout-large-tvdpi  (800x1280)
layout-large-xhdpi  (1200x1920)
layout-xlarge-mdpi  (1280x800)
layout-xlarge-xhdpi (2560x1600)

        res/layout/activity_main.xml # For handsets (smaller than 600dp available width)
        res/layout-sw600dp/activity_main.xml # For 7 inches tablets (600dp wide and bigger)
        res/layout-sw720dp/activity_main.xml # For 10 inches tablets (720dp wide and bigger)

OR
res/layout/layout #this is the default
res/layout/layout-large  #for 7 inches tablet and images from res/drawable-mdpi/xyz.png
res/layout/layout-xlarge  #for 10 inches tablet

Référencez des liens:

Support de résolution différent Android

https://developer.Android.com/guide/practices/screens_support.html

https://design.google.com/devices/

Existe-t-il une liste de résolutions d'écran pour tous les téléphones et tablettes basés sur Android?

http://www.emirweb.com/ScreenDeviceStatistics.php

Tailles d'écran/résolutions les plus populaires sur les téléphones Android

28
Sanjay Mangaroliya

Oui, j'ai le cure à votre problème, vous avez raison. Personnellement, je pense que faire des mises en page pour chaque résolution d'écran prend du temps et que la taille de votre projet augmente.

Pour faire une mise en page qui s'adapte à toutes les résolutions d'écran, j'ai implémenté ma propre technique, à savoir régler width et height en termes de pourcentage

Le problème se produit lorsque nous définissons Views/Layouts avec une valeur constante de width ou height, disons 100dp.

Solution est assez simple, essayez d'utiliser match_parent pour que la vue remplisse les espaces vides ou utilisez weight et définissez chaque View par rapport à un autre Views, cela aidera votre présentation à bien paraître dans presque toutes les résolutions d'écran et à l'exécution LayoutParams de seulement Views/Layouts qui a une constante width ou height en termes de Percentage.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <LinearLayout
        Android:id="@+id/mLayout"
        Android:layout_width="280px"
        Android:layout_height="300px" />


</RelativeLayout>

Remarque: J'ai utilisé px pour la mise en page de taille fixe width/height car dans LayoutParams layoutParams = new LayoutParams(int width, int height); la width et la height prennent la valeur pixels.

Voici un exemple de code

final ViewTreeObserver mLayoutObserver = mLayout.getViewTreeObserver();

    mLayoutObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    {

        @Override
        public void onGlobalLayout() 
        {
            DisplayMetrics metrics = getResources().getDisplayMetrics();

            int deviceWidth = metrics.widthPixels;

            int deviceHeight = metrics.heightPixels;

            float widthInPercentage =  ( (float) 280 / 320 )  * 100; // 280 is the width of my LinearLayout and 320 is device screen width as i know my current device resolution are 320 x 480 so i'm calculating how much space (in percentage my layout is covering so that it should cover same area (in percentage) on any other device having different resolution

            float heightInPercentage =  ( (float) 300 / 480 ) * 100; // same procedure 300 is the height of the LinearLayout and i'm converting it into percentage

            int mLayoutWidth = (int) ( (widthInPercentage * deviceWidth) / 100 );

            int mLayoutHeight = (int) ( (heightInPercentage * deviceHeight) / 100 );

            LayoutParams layoutParams = new LayoutParams(mLayoutWidth, mLayoutHeight);

            mLayout.setLayoutParams(layoutParams);
        }
    });

Je suppose que le code est assez explicite si quelqu'un a encore besoin d'aide, vous pouvez le demander immédiatement

Conclusion: Si vous devez définir une constante width/height pour votre Views/Layouts, définissez toujours la valeur dans px dans le fichier de présentation (i.e xml), puis définissez par programme LayoutParams.

Suggestion: Je pense que Google Android Guys devrait sérieusement songer à remplacer les unités dp/dip par percentage.

9
Muhammad Babar

Maintenant, prendre en charge différentes tailles d'écran est plus facile! Utilisez la nouvelle unité de taille SDP.

SDP - une unité de taille évolutive

Un SDK Android qui fournit une nouvelle unité de taille - sdp (dp évolutif). Cette unité de taille est adaptée à la taille de l'écran. Il peut aider les développeurs Android à prendre en charge plusieurs écrans.

pour les vues de texte, veuillez vous référer à ssp qui est basé sur l'unité de taille sp des textes.

https://github.com/intuit/sdp

1
Kamil Ibadov

Le DP évolutif (SDP) est la meilleure solution à utiliser. Cela redimensionnera les widgets en fonction de la taille de l'écran. Nous pouvons également l'appliquer à du texte pour différentes tailles de texte.

Pour ajouter un sdp à votre projet (à l'aide d'Android Studio et de Gradle):

ajoutez l'implémentation ' com.intuit.sdp: sdp-Android: 1.0.5 ' à votre bloc de dépendances build.gradle. 

for example:
dependencies {'com.intuit.sdp:sdp-Android:1.0.5' }
0
Unknown