Cargue el valor de dimensión de res / values ​​/ dimension.xml del código fuente

337

Me gustaría cargar el valor tal como está. Tengo dos dimension.xmlarchivos, uno adentro /res/values/dimension.xmly el otro adentro /res/values-sw360dp/dimension.xml.

Desde el código fuente me gustaría hacer algo como

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Esto funciona, pero el valor que obtengo se multiplica por el factor de densidad de la pantalla (1.5 para hdpi, 2.0 para xhdpi, etc.).

También intenté hacer

getResources().getString(R.dimen.tutorial_cross_marginTop);

Esto funcionaría en principio, pero obtengo una cadena que termina en "inmersión" ...

Héctor Júdez Sapena
fuente
1
Me pregunto si es un error en Android, ya que Resources tiene un método getDimensionPixelSize(int id)que indica exactamente que regresa en Pixel, por lo que getDimension(int id)debería regresar en dp (unidades independientes de la dependencia), que estaría listo para usar, por ejemplo, con ViewsetPadding
Paul Verest el

Respuestas:

812

En mi dimens.xml tengo

<dimen name="test">48dp</dimen>

En código si lo hago

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

esto devolverá 72, que como estado de documentos se multiplica por la densidad del teléfono actual (48dp x 1.5 en mi caso)

exactamente como lo dicen los documentos:

Recupere una dimensión para un ID de recurso particular. Las conversiones de unidades se basan en las DisplayMetrics actuales asociadas con los recursos.

así que si desea un valor de dp exacto, como en xml, divídalo con la densidad de DisplayMetrics

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp será 48 ahora

AndroidGecko
fuente
3
Creo que la documentación no es particularmente clara aquí. "Las conversiones de unidades se basan en las DisplayMetrics actuales asociadas con los recursos". cuando todo lo que quieren decir es que se convierten a píxeles.
Trilarion
Si esencialmente va a descartar el multiplicador de métricas de visualización, también puede definir su dimensión en px. <dimen name = "test"> 48px </dimen>. getDimension (R.dimen.test) regresará 48.
Michael Peterson
No funciona para mí: stackoverflow.com/questions/55972518/…
Alex
@Trilarion Sin embargo, no se convierten simplemente a píxeles. Están diciendo que dpdará el valor de píxel escalado relativo a la escala del objeto de recurso utilizado para recuperarlo. Una vez que entres en varias formas de obtener recursos, esto será más relevante. Para simplificar, puede pensar que es relativo a la escala de la pantalla. También hay sp, o píxeles relativos al tamaño del texto del sistema, y px, o píxeles directamente. Cada uno es diferente y tiene un propósito diferente.
Carro abandonado el
20
Context.getResources().getDimension(int id);
Jug6ernaut
fuente
18

La Resourceclase también tiene un método getDimensionPixelSize () que creo que se ajustará a sus necesidades.

Ovidiu Latcu
fuente
24
¡Esto está mal! la conversión de métricas también se produce getDimensionPixelSize()si puede consultar los documentos que establece claramente Devoluciones Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammad Babar
Esto está mal. La conversión de métricas también se realiza utilizando este método.
Michael Peterson el
14

Para aquellos que solo necesitan ahorrar algo de intvalor en los recursos, pueden hacer lo siguiente.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

Código

int defaultValue = getResources().getInteger(R.integer.default_value);
Suragch
fuente
2
Gracias por esto, era más de lo que estaba buscando a pesar de que tal vez no para otros, pero esta solución ofrecida en realidad me proporcionó una idea de otras áreas de mi código
JamisonMan111
11

Puede usar getDimensionPixelOffset () en lugar de getDimension, por lo que no tuvo que enviar a int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)
Jonny Right
fuente
2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Creo que es bueno obtener el valor según la resolución, pero si no quieres hacerlo, da esto en px .......

Píxel independiente de la densidad (dp)

Una unidad de píxel virtual que debe usar al definir el diseño de la interfaz de usuario, para expresar las dimensiones o la posición del diseño de una manera independiente de la densidad. El píxel independiente de la densidad es equivalente a un píxel físico en una pantalla de 160 ppp, que es la densidad de referencia asumida por el sistema para una pantalla de densidad "media". En tiempo de ejecución, el sistema maneja de forma transparente cualquier escala de las unidades dp, según sea necesario,based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. Siempre debe usar unidades dp al definir la interfaz de usuario de su aplicación, para garantizar la visualización adecuada de su interfaz de usuario en pantallas con diferentes densidades.

Creo que es bueno cambiar el valor según la resolución, pero si no quieres hacerlo, da esto en px .......

consulte este enlace

según esto

dp

Píxeles independientes de la densidad: una unidad abstracta que se basa en la densidad física de la pantalla. Estas unidades son relativas a una pantalla de 160 ppp (puntos por pulgada), en la que 1dp es aproximadamente igual a 1px.When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.La relación de dp a píxel cambiará con la densidad de la pantalla, pero no necesariamente en proporción directa. Usar unidades dp (en lugar de unidades px) es una solución simple para hacer que las dimensiones de la vista en su diseño cambien de tamaño correctamente para diferentes densidades de pantalla. En otras palabras, proporciona consistencia para los tamaños del mundo real de los elementos de la interfaz de usuario en diferentes dispositivos.

px

Píxeles: corresponde a los píxeles reales en la pantalla. Esta unidad de medida no se recomienda porque la representación real puede variar entre dispositivos; cada dispositivo puede tener un número diferente de píxeles por pulgada y puede tener más o menos píxeles totales disponibles en la pantalla.

Dheeresh Singh
fuente
2

Use una extensión de Kotlin

Puede agregar una extensión para simplificar este proceso. Le permite simplemente llamar context.dp(R.dimen. tutorial_cross_marginTop)para obtener el valor Float

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

Si desea manejarlo sin contexto, puede usar Resources.getSystem():

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

Por ejemplo, en un dispositivo xhdpi, use 24.dppara obtener 12.0 o 12.pxpara obtener 24

Gibolt
fuente