He tenido graves problemas para hacer que LayoutInflater funcione como se esperaba, y también lo hicieron otras personas: ¿Cómo usar layoutinflator para agregar vistas en tiempo de ejecución? .
¿Por qué LayoutInflater ignora los parámetros de diseño que he especificado? Por ejemplo, ¿por qué no se respetan los valores layout_width
y layout_height
valores de mis recursos XML?
android
android-layout
andig
fuente
fuente
Respuestas:
He investigado este problema, refiriéndome a los documentos de LayoutInflater y configurando un pequeño proyecto de demostración de muestra. Los siguientes tutoriales muestran cómo llenar dinámicamente un diseño usando
LayoutInflater
.Antes de comenzar, vea cómo se ven los
LayoutInflater.inflate()
parámetros:R.layout.main_page
)attachToRoot
estrue
), o simplemente un objeto que proporciona un conjunto deLayoutParams
valores para la raíz de la jerarquía devuelta (siattachToRoot
esfalse
).attachToRoot : ¿Se debe adjuntar la jerarquía inflada al parámetro raíz? Si es falso, la raíz solo se usa para crear la subclase correcta de
LayoutParams
la vista raíz en el XML.Devuelve : La vista raíz de la jerarquía inflada. Si la raíz fue suministrada y
attachToRoot
estrue
, esta es la raíz; de lo contrario, es la raíz del archivo XML inflado.Ahora para el diseño de muestra y el código.
Diseño principal (
main.xml
):Se agrega a este contenedor un TextView separado, visible como un pequeño cuadrado rojo si los parámetros de diseño se aplican con éxito desde XML (
red.xml
):Ahora
LayoutInflater
se usa con varias variaciones de parámetros de llamadaLos resultados reales de las variaciones de los parámetros están documentados en el código.
SINOPSIS: Llamar
LayoutInflater
sin especificar la raíz conduce a inflar la llamada ignorando los parámetros de diseño del XML. Llamar a inflar con raíz no es igualnull
yattachRoot=true
carga los parámetros de diseño, pero devuelve el objeto raíz nuevamente, lo que evita más cambios de diseño en el objeto cargado (a menos que pueda encontrarlo usandofindViewById()
). Por lo tanto, la convención de llamadas que probablemente le gustaría usar es esta:Para ayudar con los problemas de diseño, se recomienda encarecidamente el Inspector de diseño .
fuente
Activity
es una subclase deContext
y los ejemplos de la respuesta están en el alcance deActivity
, por lo que para simplificar, reemplacégetBaseContext()
porthis
, en aras de esta respuesta, es equivalente.andig tiene razón en que una razón común para que LayoutInflater ignore sus layout_params sería porque no se especificó una raíz. Mucha gente piensa que puede pasar nulo por raíz. Esto es aceptable para algunos escenarios, como un diálogo, en el que no tiene acceso a root en el momento de la creación. Sin embargo, una buena regla a seguir es que si tiene root, déselo a LayoutInflater.
Escribí una publicación de blog en profundidad sobre esto que puedes consultar aquí:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
fuente
This is acceptable for a few scenarios such as a dialog
eso era todo lo que necesitabaQuiero agregar a la respuesta principal anterior
Intenté seguirlo, pero mi recyclerView comenzó a estirar cada elemento a una pantalla.
Tuve que agregar la siguiente línea después de inflar para alcanzar el objetivo
Ya agregué estos parámetros por xml pero no funcionó correctamente
y con esta línea todo está bien
fuente