Escribí esta respuesta porque, incluso después de pasar por varias páginas de StackOverflow, no pude comprender claramente qué significaba attachToRoot. A continuación se muestra el método inflate () en la clase LayoutInflater.
View inflate (int resource, ViewGroup root, boolean attachToRoot)
Eche un vistazo al archivo activity_main.xml , el diseño button.xml y MainActivity.java archivo que creé.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
button.xml
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
LinearLayout root = (LinearLayout) findViewById(R.id.root);
View view = inflater.inflate(R.layout.button, root, false);
}
Cuando ejecutamos el código, no veremos el botón en el diseño. Esto se debe a que el diseño de nuestro botón no se agrega al diseño de actividad principal, ya que attachToRoot está establecido en falso.
LinearLayout tiene un método addView (vista de vista) que se puede usar para agregar vistas a LinearLayout. Esto agregará el diseño del botón al diseño de la actividad principal y hará que el botón sea visible cuando ejecute el código.
root.addView(view);
Eliminemos la línea anterior y veamos qué sucede cuando establecemos attachToRoot como verdadero.
View view = inflater.inflate(R.layout.button, root, true);
Nuevamente vemos que el diseño del botón es visible. Esto se debe a que attachToRoot adjunta directamente el diseño inflado al elemento primario especificado. Que en este caso es root LinearLayout. Aquí no tenemos que agregar las vistas manualmente como lo hicimos en el caso anterior con el método addView (Vista de vista).
¿Por qué las personas obtienen IllegalStateException al establecer attachToRoot como verdadero para un Fragment?
Esto se debe a que para un fragmento ya ha especificado dónde colocar su diseño de fragmento en su archivo de actividad.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
El complemento (int parent, Fragment fragment) agrega el fragmento que tiene su diseño al diseño padre. Si configuramos attachToRoot como verdadero, obtendrá IllegalStateException: el elemento secundario especificado ya tiene un elemento primario. Dado que el diseño de fragmentos ya se ha agregado al diseño primario en el método add ().
Siempre debe pasar false para attachToRoot cuando esté inflando Fragments. El trabajo del FragmentManager es agregar, eliminar y reemplazar Fragmentos.
De vuelta a mi ejemplo. ¿Qué pasa si hacemos las dos cosas?
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
En la primera línea, LayoutInflater adjunta el diseño del botón al diseño raíz y devuelve un objeto Ver que contiene el mismo diseño del botón. En la segunda línea, agregamos el mismo objeto Ver al diseño raíz principal. Esto da como resultado la misma IllegalStateException que vimos con Fragments (el elemento secundario especificado ya tiene un elemento primario).
Tenga en cuenta que existe otro método inflate () sobrecargado, que establece attachToRoot como verdadero de forma predeterminada.
View inflate (int resource, ViewGroup root)