J'ai écrit cette réponse parce que même après avoir parcouru plusieurs pages StackOverflow, je n'ai pas pu comprendre clairement ce que signifiait attachToRoot. Vous trouverez ci-dessous la méthode inflate () dans la classe LayoutInflater.
View inflate (int resource, ViewGroup root, boolean attachToRoot)
Jetez un oeil à activity_main.xml fichier, button.xml mise en page et le MainActivity.java fichier que j'ai créé.
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);
}
Lorsque nous exécutons le code, nous ne voyons pas le bouton dans la présentation. Cela est dû au fait que la disposition de nos boutons n'est pas ajoutée à la disposition principale de l'activité car attachToRoot est défini sur false.
LinearLayout possède une méthode addView (View view) qui peut être utilisée pour ajouter des vues à LinearLayout. Cela ajoutera la disposition des boutons à la disposition principale de l'activité et rendra le bouton visible lorsque vous exécuterez le code.
root.addView(view);
Supprimons la ligne précédente et voyons ce qui se passe lorsque nous définissons attachToRoot sur true.
View view = inflater.inflate(R.layout.button, root, true);
Encore une fois, nous voyons que la disposition des boutons est visible. En effet, attachToRoot attache directement la disposition gonflée au parent spécifié. Qui dans ce cas est root LinearLayout. Ici, nous n'avons pas à ajouter les vues manuellement comme nous l'avons fait dans le cas précédent avec la méthode addView (View view).
Pourquoi les gens obtiennent-ils IllegalStateException lorsqu'ils définissent attachToRoot comme true pour un fragment.
En effet, pour un fragment, vous avez déjà spécifié où placer la disposition de votre fragment dans votre fichier d'activité.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
L' ajout (int parent, Fragment fragment) ajoute le fragment qui a sa disposition à la disposition parent. Si nous définissons attachToRoot sur true, vous obtiendrez IllegalStateException: l'enfant spécifié a déjà un parent. Puisque la disposition des fragments est déjà ajoutée à la disposition parent dans la méthode add ().
Vous devez toujours passer false pour attachToRoot lorsque vous gonflez des fragments. Le travail du FragmentManager consiste à ajouter, supprimer et remplacer des fragments.
Revenons à mon exemple. Et si nous faisons les deux.
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
Dans la première ligne, LayoutInflater attache la disposition des boutons à la disposition racine et renvoie un objet View qui contient la même disposition des boutons. Dans la deuxième ligne, nous ajoutons le même objet View à la disposition racine parent. Il en résulte la même exception IllegalStateException que nous avons vue avec les fragments (l'enfant spécifié a déjà un parent).
Gardez à l'esprit qu'il existe une autre méthode inflate () surchargée, qui définit attachToRoot comme true par défaut.
View inflate (int resource, ViewGroup root)