2011-09-22 36 views
12

Por ejemplo, en un diseño específico que tienen la siguiente XML:¿Cuándo debería usarse el archivo dimens.xml en Android?

vista
<GridView 
    android:id="@+id/gridView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="3dp" 
    android:columnWidth="48dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="spacingWidth" /> 

Esta rejilla es específico para esta disposición y no creo que voy a estar utilizando otros puntos de vista de cuadrícula con propiedades similares. Eso para decir que los valores de dimensión en el código son específicos para esa vista de cuadrícula.

¿Debo seguir moviéndolos a un archivo dimens.xml o está bien dejarlos así? Si es así, ¿debo colocar valores en el archivo dimens.xml solo cuando ese valor se usa en múltiples diseños?

Respuesta

22

dejo caer los valores de dimensión en un recurso dimens.xml normalmente por tres razones:

  1. Reutilización: Necesito múltiples widgets o diseños para utilizar el mismo valor y sólo quiero cambiar una vez al actualizar o ajustar en toda la aplicación
  2. Diferencia de densidad: si necesito que la dimensión sea ligeramente más pequeña o más grande de ldpi -> hdpi o pequeña -> grande
  3. Lectura desde el código: cuando estoy instanciando una vista en el código y quiero aplique algunas dimensiones estáticas, poniéndolos en dimens.xml como "dp" o "dip" lo permite para obtener un valor escalado en código Java con Resources.getDimensionPixelSize()

HTH!

+0

Acerca de # 2, ¿cómo haces esa distinción en el archivo 'dimens.xml' (proporciona un ejemplo si es posible)? La razón 3 es muy convincente. –

+0

@Nazgulled archivos múltiples en directorios calificados. Por ejemplo, poner un 'dimens.xml' en' res/values' para valores predeterminados y otro en 'res/values-ldpi' que incluye los pocos que quiero anular para dispositivos de baja densidad. – Devunwired

+0

Pensé que solo estaba disponible para la carpeta de los drawables. Gracias por el consejo. –

2

El archivo dimens.xml se utiliza para mantener todos los valores de píxeles codificados en un solo lugar.

Ahora, aunque puede que no use repetidamente estos valores en este momento, sigue siendo una buena idea colocarlos en dimens.xml para referencia futura. Además, seguir un paradigma de programación Android estándar ayuda a otros desarrolladores a comprender su código más rápidamente. Esto es muy similar al strings.xml donde colocamos String s ¡algunos de los cuales terminan siendo utilizados solo una vez! :)

+2

No es exactamente lo mismo, los archivos de cadenas XML también permiten la internacionalización, por lo que tiene más sentido separarlos del código. –

+1

¿Qué tipo de comentario es ese? –

+0

Lo siento si no me aclaro. Me refiero a que tus comentarios realmente no ayudaron a la pregunta de la publicación original ni son completamente relevantes para mi publicación. ¡Solo estoy siendo honesto! :) –

1

respuesta Suplementario

listas @Devunwired 3 razones para usar dimens.xml. Aquí están los detalles de cómo hacer eso.

1. Reutilización

Si establece alguna dp o sp valor en dimens.xml vez como esto

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="textview_padding">16dp</dimen> 
    <dimen name="large_text_size">30sp</dimen> 
</resources> 

se puede reutilizar a través de su aplicación en múltiples ubicaciones.

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

<TextView 
    android:padding="@dimen/textview_padding" 
    android:textSize="@dimen/large_text_size" 
    ... /> 

A continuación, cuando se necesita hacer un cambio, sólo es necesario hacerlo en un solo lugar.

Notas

  • Este es básicamente el mismo efecto que el uso de un estilo o tema.
  • Tenga cuidado de no dar dos vistas diferentes el mismo valor dimen si realmente no deberían ser.Si necesita realizar cambios en un conjunto de vistas pero no en otro, deberá volver a cada una de ellas individualmente, lo que frustra el objetivo.

2. Tamaño Diferencia

  • @Devunwired llama esta diferencia Densidad, pero si está utilizando dp (píxeles independientes de densidad), esto ya se hace cargo son el problema diferencia de densidad para todos, pero los casos más pequeños. Entonces, en mi opinión, el tamaño de la pantalla es un factor más importante para usar dimens.xml.

Un 8dp de relleno puede parecer grande en un teléfono, pero cuando la aplicación se ejecuta en una tableta, parece demasiado estrecho. Puede resolver este problema haciendo dos (o más) versiones diferentes de dimens.xml.

Haga clic con el botón derecho en su carpeta res y elija Nuevo> Archivo de recursos de valor. Luego escriba dimens y elija Ancho de pantalla más pequeño. Escriba en para el ancho (7 "tableta). (Hay otras formas de elegir los tamaños. Ver la documentation y this answer por más.)

enter image description here

Esto hará otra carpeta values que será utilizada para los dispositivos cuyo ancho de la pantalla más pequeña es 600dp. En la vista de Android, los dos archivos dimens.xml se ven así.

enter image description here

Ahora se puede modificar de forma independiente.

valores/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">16dp</dimen> 
</resources> 

valores sw600dp/dimens.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_default_padding">64dp</dimen> 
</resources> 

Al usar su dimen es suficiente para establecer con el nombre que utilizó en ambos archivos dimens.xml.

<LinearLayout 
    ... 
    android:padding="@dimen/my_default_padding"> 

</LinearLayout> 

El sistema seleccionará automáticamente el valor adecuado para usted en función del dispositivo que el usuario está utilizando.

3. Lectura desde el código

A veces es un dolor de escala mediante programación entre px y dp (ver this answer por cuánto).

Si usted tiene un valor fijo dp ya definido en dimens.xml como esto

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="my_dp_value">16dp</dimen> 
</resources> 

Entonces usted puede conseguir fácilmente con

int sizeInPixels = getResources().getDimensionPixelSize(R.dimen.my_dp_value); 

y ya se habrá convertido en píxeles por cualquier dispositivo de la densidad el usuario tiene.

+0

esto es muy útil. ¿Conoces una manera de forzar a Android Studio a elegir un dimens.xml específico para usarlo durante la vista previa del diseño? Tengo problemas para configurar un archivo para Samsung S7 landscape: he creado un archivo de valores sw640dp, pero la vista previa selecciona el valor predeterminado. –

+0

@orionelenzil, no sé acerca de la vista previa del diseño. Puede intentar hacer una nueva pregunta sobre esto. Diré que 'sw600dp' es una configuración más estándar que' sw640dp'. Este es el ancho más pequeño, por lo que '600' incluirá' 640' y cualquier otro tamaño más grande. Además, siempre y cuando obtenga las dimensiones correctas cuando ejecuta la aplicación en el emulador o en un dispositivo, no creo que realmente importe si la vista previa no funciona. – Suragch

+0

gracias @Suragch. Publiqué una nueva pregunta [aquí] (https://stackoverflow.com/questions/49138505/android-difficulty-working-with-dimens-xml-files). –

Cuestiones relacionadas