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:
- recurso : ID para cargar un recurso de diseño XML (por ejemplo,
R.layout.main_page
)
- root : Vista opcional para ser el padre de la jerarquía generada (si
attachToRoot
es true
), o simplemente un objeto que proporciona un conjunto de LayoutParams
valores para la raíz de la jerarquía devuelta (si attachToRoot
es false
).
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
es true
, 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
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
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
):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Ahora LayoutInflater
se usa con varias variaciones de parámetros de llamada
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Los 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 igual null
y attachRoot=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 usando findViewById()
). Por lo tanto, la convención de llamadas que probablemente le gustaría usar es esta:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Para ayudar con los problemas de diseño, se recomienda encarecidamente el Inspector de diseño .