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_widthy layout_heightvalores 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)attachToRootestrue), o simplemente un objeto que proporciona un conjunto deLayoutParamsvalores para la raíz de la jerarquía devuelta (siattachToRootesfalse).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
LayoutParamsla vista raíz en el XML.Devuelve : La vista raíz de la jerarquía inflada. Si la raíz fue suministrada y
attachToRootestrue, 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
LayoutInflaterse 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
LayoutInflatersin 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 igualnullyattachRoot=truecarga 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
Activityes una subclase deContexty 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 dialogeso 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