¿Cómo definir dimens.xml para cada tamaño de pantalla diferente en Android?

128

Cuando se admiten diferentes tamaños de pantalla (densidades) en Android, a menudo el foco está en crear diferentes diseños para cada pantalla posible. ES DECIR

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

Diseñé un diseño para una pantalla xhdpi como referencia y definí sus dimensiones en dimens.xml . Ahora quiero dar soporte a todos los tamaños de pantalla posibles. ¿Cómo puedo hacer eso?

Hasta donde sé, puedo usar esta herramienta para determinar el dimens.xml adecuado para otros tamaños de pantalla y agregarlo a mi proyecto. ¿Es esta la forma correcta de hacerlo en mi situación?

Otra pregunta, ¿solo necesito crear dimens.xml para las dimensiones de pantalla anteriores? En caso afirmativo, ¿qué es?w820dp ?

Gracias por tu ayuda. Solo necesito soportar teléfonos (no tabletas u otros dispositivos).

Amit Pal
fuente
1
Sí, tienes que crear diferentes dimesn.xmlarchivos para diferentes resoluciones.
Piyush
@PiyushGupta ¿Eso será para toda la pantalla dimensional anterior? Pero, ¿qué es W820dpalgo compatible con diferentes versiones de Android? ¿También me puede sugerir algún tutorial sobre el soporte de diferentes pantallas en base a dimens.xml?
Amit Pal
Es para tableta o para otros. De lo contrario, como dije, debe crear una carpeta de valores diferente.
Piyush

Respuestas:

266

Debe crear una carpeta de diferentes valores para diferentes pantallas . Me gusta

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

ingrese la descripción de la imagen aquí

Para más información puede visitar aquí.

Carpetas de diferentes valores en Android

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

Editado por @humblerookie

Puede utilizar el complemento de Android Studio llamado Dimenify para generar automáticamente valores de dimensión para otros depósitos de píxeles basados ​​en factores de escala personalizados. Todavía está en beta, asegúrese de notificar cualquier problema / sugerencia que encuentre al desarrollador.

IntelliJ Amiya
fuente
1
¿No debería haber "values-sw480dp-hdpi" .xhdpi y xxhdpi y así sucesivamente? solo 320dp tienen tal en su respuesta ... por favor responda
Sharp Edge
2
@IntelliJAmiya: debe mencionar la diferencia entre Android <= 3.2 y> 3.2.
juergen d
55
@ IntelliJAmiya He creado un complemento de estudio llamado Dimenify. Esto le permite crear dimensiones para otros cubos fácilmente. ¿Podría agregar una edición con la misma para que otros puedan usarla? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie
3
Este Dimenify es una gran herramienta
Muhammed Refaat
1
@IntelliJAmiya seguro, habrá nuevas versiones que no se cubrirán en esas carpetas y / o pueden no ser apropiadas en ciertas carpetas.
ralphgabb
35

Utilice DP escalable

Aunque hacer un diseño diferente para diferentes tamaños de pantalla es teóricamente una buena idea, puede ser muy difícil adaptarse a todas las dimensiones de pantalla y densidades de píxeles. Tener más de 20+ diferentesdimens.xml archivos , como se sugiere en las respuestas anteriores, no es fácil de administrar.

Cómo utilizar:

Para utilizar sdp:

  1. Incluir implementation 'com.intuit.sdp:sdp-android:1.0.5'en tubuild.gradle ,
  2. Reemplace cualquier dpvalor tal como 50dpcon un @dimen/50_sdpsimilar así:

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

Cómo funciona:

sdpescala con el tamaño de la pantalla porque es esencialmente una gran lista de diferentes dimens.xmlpara cada dpvalor posible .

ingrese la descripción de la imagen aquí

Véalo en acción:

Aquí está en tres dispositivos con dimensiones y densidades de pantalla muy diferentes:

ingrese la descripción de la imagen aquí

Tenga en cuenta que el sdpcálculo de la unidad de tamaño incluye algunas aproximaciones debido a algunas limitaciones de rendimiento y usabilidad.

Ventaja S
fuente
Muy agradecido. Esto fue realmente útil para mí.
twenk11k
@Advait, ¿puede decirme qué carpeta de valores debo usar para Samsung Edge 7 con un móvil de 5,5 pulgadas con una resolución de 2560x1440?
ULHAS PATIL
@Advait actualmente estoy usando la carpeta values-xxhdpi pero el problema es que está tomando la misma carpeta para 5, 5.5 y 6 pantallas, la misma carpeta por lo que aparece un desplazamiento en pantallas de 5 pulgadas y 5.5. No quiero eso ¿me pueden ayudar en esto?
ULHAS PATIL
@Advait S values-xxhdpi para 5.5 "1080x1920 y también para 5.5" 1440x2560 Quiero una carpeta diferente para 5.5 "1440x2560.
ULHAS PATIL
@ULHASPATIL exactamente! Me topé con un problema similar y no entiendo cómo resolverlo. ¿Encontró alguna solución para la pantalla con pulgadas similares y diferente resolución de píxeles?
Georgiy Chebotarev
27

Queremos ver los cambios del tamaño de vista requerido en diferentes pantallas.

Necesitamos crear carpetas de valores diferentes para pantallas diferentes y colocar el archivo dimens.xml en función de las densidades de pantalla.

Tomé un TextView y observé los cambios cuando cambié dimens.xml en diferentes carpetas de valores.

Por favor sigue el proceso

normal - xhdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos lo normal: xhdpi \ dimens.xml

Nexus 5X (5.2 "* 1080 * 1920: 420 ppp)

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

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

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

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos Xlarge - xhdpi \ dimens.xml

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

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

grande - xhdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos el tamaño grande: xhdpi \ dimens.xml

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

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

Las siguientes pantallas son visibles en "Buscar teléfonos y tabletas genéricos"

grande - mdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos el tamaño grande: mdpi \ dimens.xml

5.1 "WVGA (480 * 800: mdpi)

5.4 "FWVGA (480 * 854: mdpi)

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

normal - hdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos lo normal - hdpi \ dimens.xml

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

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

pequeño - ldpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos las pequeñas: ldpi \ dimens.xml

Control deslizante QVGA de 2.7 "(240 * 320: ldpi)

2.7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos xlarge - mdpi \ dimens.xml

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

normal - ldpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos lo normal: ldpi \ dimens.xml

3.3 "WQVGA (240 * 400: LDPI)

3.4 "WQVGA (240 * 432: LDPI)

normal - hdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos lo normal - hdpi \ dimens.xml

4.0 "WVGA (480 * 800: hdpi)

3.7 "WVGA (480 * 800: hdpi)

Control deslizante FWVGA de 3.7 "(480 * 854: hdpi)

normal - mdpi \ dimens.xml

Los siguientes dispositivos pueden cambiar el tamaño de las pantallas cuando cambiamos lo normal: mdpi \ dimens.xml

Control deslizante HVGA de 3.2 "(ADP1) (320 * 480: MDPI)

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

koteswarao
fuente
Entonces, según usted, las carpetas se llamarían algo así values-normal-xhdpi.
VonSchnauzer
Sí, estoy de acuerdo con usted, en lugar de escribir valores en todos los archivos, dije, "cree carpetas de valores diferentes para tamaños de texto diferentes". Así que por favor lea el título. Gracias.
koteswarao
9

Hay buenas bibliotecas que manejarán todo y reducirán su dolor. Para usarlo, solo agregue dos dependencias en gradle:

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

Después de eso, use dimensasí:

        android:layout_marginTop="@dimen/_80sdp"
Shivam Yadav
fuente
3
Aquí están las bibliotecas de referencia: SDP y SSP . Y gracias por esta respuesta precisa!
JorgeAmVF
7

He subido un programa simple de Java que toma la ubicación de su proyecto y el archivo de dimensión que desea como entrada. Basado en eso, generaría el archivo de dimensión correspondiente en la consola. Aquí está el enlace:

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

Aquí está el código completo para la referencia:

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
fuente
6

Debe crear una valuescarpeta diferente para diferentes pantallas y colocar el dimens.xmlarchivo de acuerdo con las densidades.

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
fuente
¿Dónde puedo obtener la ración entre el tamaño de la pantalla? Como puedo ver en la herramienta que definen todo en ldpi, mdpiforma
Amit Pal
Eso dependerá de su carpeta de valores, que serán valores retreive como máximo de ella.
Piyush
¿Debo mencionar values-xxhdpipara Nexus 6?
Amit Pal
Sí, necesitas ser!
Piyush
320x480Es típico mdpi . Entonces, póngalo dentro valueso dentrovalues-mdpi
Phantômaxx
6

Se puede poner dimens.xmlen

1) valores

2) valores-hdpi

3) valores-xhdpi

4) valores-xxhdpi

Y proporcione diferentes tamaños en las dimens.xmlcarpetas correspondientes según las densidades.

Anoop M
fuente
2
De acuerdo con la documentación de Android, pequeño / normal / grande están en desuso.
Benjamin Mesing
1

En caso de que quiera ver más: Aquí hay un enlace para una lista de dispositivos (tabletas, teléfonos, relojes), incluyendo watch, chromebook, windowsymac . Aquí puede encontrar la densidad, las dimensiones, etc. Basándome aquí, es un buen recurso si también está usando un emulador.

Si hace clic en un elemento específico, mostrará más detalles en el lado derecho. muestra

Ya que es Android, voy a publicar relacionados con él. muestra1

muestra2

~ Es mejor si guarda una copia de la web. Para verlo sin conexión.

RoCk RoCk
fuente
1

Android 3.2 presenta un nuevo enfoque para los tamaños de pantalla, los números que describen el tamaño de la pantalla están todos en unidades "dp".

dp de ancho más pequeño: el ancho más pequeño disponible para el diseño de la aplicación en unidades "dp"; Este es el dp de ancho más pequeño que encontrará en cualquier rotación de la pantalla.

Para crear un clic derecho en res >>> nuevo >>> directorio de recursos de Android

Desde la ventana Calificadores disponibles , mueva el Ancho de pantalla más pequeño a Calificadores elegidos

En ancho de pantalla ventana pantalla, simplemente escriba el valor "dp" a partir del cual desea que Android Studio use esas monedas.

Luego, cambie a la vista Proyecto , haga clic derecho en el nuevo directorio de recursos creado

nuevo >>> Archivo de recursos de valores ingrese un nuevo nombre de archivo dimens.xml y listo.

Levon Petrosyan
fuente
Gracias por explicar cómo crear realmente estas carpetas.
Beko