El LayoutInflater toma el archivo XML como entrada y crea objetos de vista a partir de él. Es justo que entendiéramos lo que hace Layout Flater.
Veamos qué Layoutflater.el documento inflate () dice y especialmente sobre attachToRoot.
booleano: ¿Si la jerarquía inflada debe adjuntarse al parámetro raíz? Si es false, root solo se usa para crear la subclase correcta de LayoutParams para la vista raíz en el XML.
La idea general es esta: Si attachToRoot se establece a true, el archivo de diseño especificado en el primer parámetro se infla y se adjunta a la ViewGroup especificado en el segundo parámetro.
Cuando attachToRoot es false, el archivo de diseño del primer parámetro se infla y se devuelve como una Vista. Significa que la raíz solo se usa para crear la subclase correcta de LayoutParams para la vista raíz (del primer parámetro) en el XML.
Pasar true para attachToRoot da como resultado que la Vista inflada de un archivo de diseño se agregue al grupo de vistas en el acto. Pasar false para attachToRoot significa que la Vista creada a partir del archivo de diseño se agregará al ViewGroup de alguna otra manera.
Vamos a desglosarlo en dos escenarios:
attachToRoot Establecido en True
- Imagine que especificamos un botón en un archivo de diseño XML con su ancho de diseño y su altura de diseño configurados en match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/action_attach_to_root_true"
android:id="@+id/button_ok">
</Button>
- Ahora queremos agregar este Botón mediante programación a un diseño lineal dentro de una Actividad. En nuestra variable de miembro LinearLayout padre, simplemente podemos agregar el botón con lo siguiente:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- Especificamos que queremos inflar el Botón de su archivo de recursos de diseño; luego le decimos al LayoutInflater que queremos adjuntarlo al padre. Nuestros parámetros de diseño son respetados porque sabemos que el botón se agrega a un diseño lineal. El tipo de parámetros de diseño del botón debe ser LinearLayout.LayoutParams.
2. attachToRoot Establecido en False
- Echemos un vistazo a cuándo desea establecer attachToRoot en false. En este escenario, la Vista especificada en el primer parámetro de inflate() no se adjunta al grupo de vista del segundo parámetro en este momento. Recuerde nuestro ejemplo de botón anterior, donde queremos adjuntar un botón personalizado de un archivo de diseño al padre. Todavía podemos adjuntar nuestro Botón al padre pasando false para attachToRoot, simplemente lo agregamos manualmente nosotros mismos después.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- El ejemplo de false attachToRoot requiere un poco más de trabajo cuando agregamos manualmente la vista a un ViewGroup. Agregar nuestro botón a nuestra disposición lineal era más conveniente con una línea de código cuando attachToRoot era verdadero.
- Veamos algunos escenarios que requieren absolutamente que attachToRoot sea falso. Los niños de RecyclerView deben inflarse con el pie de fijación que se pasa como falso. Las vistas secundarias están infladas en onCreateViewHolder(). RecyclerViews, no nosotros, son responsables de determinar cuándo inflar y presentar sus puntos de vista secundarios. El parámetro attachToRoot debe ser false en cualquier momento en que no seamos responsables de agregar una vista a un ViewGroup.
- Hay algunos escenarios en los que no tendrá un grupo de vista raíz para pasar a inflate(). Al crear una vista personalizada para un AlertDialog, todavía no tiene acceso a su vista principal.
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = getActivity().getLayoutInflater();View rootView = inflater.inflate(R.layout.fragment_hello_dialog,null,false);builder.setView(rootView);
builder.setTitle("Alert");
builder.setPositiveButton("Ok", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});return builder.create();
- En este caso, está bien para pasar en null para la raíz ViewGroup. Resulta que el AlertDialog podría invalidar cualquier LayoutParams a match_parent de todos modos. Sin embargo, la regla general es aprobar al padre si puedes hacerlo.
Para recapitular:
- Si tiene un padre para pasar al parámetro root ViewGroup, hágalo.
- Intente evitar pasar null para el grupo de vista raíz.
- Pase false para el parámetro attachToRoot cuando no somos los responsables de adjuntar la Vista de nuestro archivo de diseño a su grupo de vista raíz.
- No pasar true para una vista que ya se ha adjuntado a un ViewGroup.
- Las vistas personalizadas son un buen caso de uso para pasar true para attachToRoot.
Un agradecimiento especial a Sean Farrel, sobre su maravilloso artículo sobre LayoutInflater aquí traté de resumir en pocas palabras.
¡Feliz codificación y escritura sobre codificación!
Si esto le resultó útil, haga clic en below a continuación. Síganme para más artículos sobre tecnología.