studio recursos programacion móviles getresources desarrollo curso aplicaciones android resources fill-parent

android - programacion - ¿Cómo puedo usar layout_width usando el archivo de recursos?



r.id android studio (8)

Como se mencionó anteriormente en https://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT MATCH_PARENT = -1 y WRAP_CONTENT = -2. En lugar de declarar los valores como recursos de Dimension, los he declarado con éxito y los he usado como recursos enteros. Para que el ejemplo funcione, puede usar dos archivos de recursos Integer:

values ​​/ integers.xml

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

values-sw600dp / integers.xml

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

Y el archivo de diseño será:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="@integer/tutorial_width" android:layout_height="match_parent">

Hay una actividad en la que quiero llenar la pantalla de un teléfono y una ventana emergente (diálogo) para una tableta.

Pensé en hacer un archivo de diseño como este,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="@dimen/main_layout_width" android:layout_height="match_parent">

y externalizar el valor de ancho como

en valores / dimens.xml

<dimen name="tutorial_width">match_parent</dimen>

en values-xlarge / dimens.xml

<dimen name="tutorial_width">320dp</dimen>

Pero no puedo representar ''match_parent'' como elemento dimen. ¿Alguna ayuda? ¡Gracias!


De acuerdo con esta gran contribución: http://blog.danlew.net/2015/01/06/handling-android-resources-with-non-standard-formats/

  1. Intentemos definir tanto match_parent como wrap_content sin un formato:

    <item name="match_parent" type="dimen">-1</item> <item name="wrap_content" type="dimen">-2</item>

  2. Podemos hacer referencia a aquellos en cualquier otro valor de dimensión:

    <!-- Inside /res/values/dimens.xml --> <dimen name="responsive_width">@dimen/match_parent</dimen> <!-- Inside /res/values-sw800dp/dimens.xml --> <dimen name="responsive_width">800dp</dimen>

Para obtener más información, visite la página web que mencioné anteriormente.


La mejor manera que encontré: - en lugar de "match_parent" y "fill_parent" escribe "-1dp" - en lugar de "wrap_content" escribe "-2dp"


Lo que funciona para mí y probablemente presenta corrección académica es algo como esto:

<!-- In values/dimens.xml --> <item name="width_match_unless_huge" type="dimen" format="integer">-1</item> <!-- In values-sw600dp/dimens.xml --> <item name="width_match_unless_huge" type="dimen" format="dimension">600dp</item>

Esto le permite mezclar constantes de comportamiento de tamaño como MATCH_PARENT y tamaños concretos en dp dependiendo de la configuración actual.

Lo <dimen/> como un <dimen/> regular:

<LinearLayout android:layout_width="@dimen/width_match_unless_huge" .../>


Puede crear dos diseños: predeterminado con android: layout_height = "match_parent" en el directorio "layout", y para tablet android: layout_height = "320dp" en el directorio "layout-xlarge"


Todavía no puedo comentar, así que estoy escribiendo una nueva respuesta. Utilicé la respuesta proporcionada por @pjanecze en mi proyecto. Todo estuvo bien hasta hace unos días cuando de repente algunos dispositivos comenzaron a informar el extraño posicionamiento de los dispositivos. Dispositivos con densidad muy alta, en lugar de obtener match_parent como -1 de mis dimensiones (que era equivalente a android constante match_parent = -1 en los parámetros de diseño), obtenía -2, lo que significa que el ancho se estableció en wrap_content (-2 en layout_parameters). Obviamente porque -1dp se convierte en píxeles en tiempo de ejecución y -1dp en algunos casos -2px.

Entonces ... en lugar de usar constante -1dp y -2dp, debe usar -1px y -2px para match_parent y wrap_content.


Usé un estilo para solucionar este problema. Tener elementos de estilo xml separados con android: elementos de layout_width para diferentes tamaños de pantalla resolvió el problema sin usar el -1dp no documentado


dp depende de las métricas de visualización del dispositivo y no funcionará en todos los dispositivos sin un conjunto de superposiciones específicas de densidad; sin embargo, se puede usar px su lugar.

Desafortunadamente, la técnica de redondeo simple utilizada por TypedValue#complexToDimensionPixelSize() solo considera valores no negativos:

final int res = (int)(f+0.5f); if (res != 0) return res; if (value == 0) return 0; if (value > 0) return 1; return -1;

Cuando f (el valor de px) es negativo, el resultado generalmente se redondea incorrectamente porque siempre usa la suma. Los siguientes tamaños de píxeles se observan para las dimensiones de px negativas:

0px = 0.0 -1px = -1.0 -2px = -1.0 -3px = -2.0 -4px = -3.0 -5px = -4.0 ...

Abrí un problema de AOSP para este método:

TypedValue # complexToDimensionPixelSize () redondea las dimensiones negativas incorrectamente

Teniendo en cuenta este comportamiento, los siguientes valores funcionarán en todos los dispositivos:

<dimen name="match_parent">-2px</dimen> <dimen name="wrap_content">-3px</dimen>

Puede usar -1px o -2px para match_parent, pero wrap_content debe ser -3px. Cualquiera de las combinaciones funciona en dispositivos y emuladores.

En la práctica, he descubierto que la función Vista previa de IntelliJ no puede representar diseños cuando -1px se usa para match_parent, y representa de forma incorrecta -2px como si fuera "wrap_content" cuando se hace referencia a otra dimensión, por ejemplo <dimen name="my_width">@dimen/match_parent</dimen> . He abierto un problema para IntelliJ IDEA:

La vista previa de Android no puede representar layout_width = "- 1px"