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/
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>
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"