attachToRoot Ustaw na true:
Jeśli właściwość attachToRoot ma wartość true, plik układu określony w pierwszym parametrze jest nadmuchiwany i dołączany do grupy ViewGroup określonej w drugim parametrze.
Wyobraź sobie, że podaliśmy przycisk w pliku układu XML z szerokością i wysokością układu ustawioną na match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>
Chcemy teraz programowo dodać ten przycisk do liniowego układu wewnątrz fragmentu lub działania. Jeśli nasz LinearLayout jest już zmienną składową mLinearLayout, możemy po prostu dodać przycisk w następujący sposób:
inflater.inflate(R.layout.custom_button, mLinearLayout, true);
Określiliśmy, że chcemy nadmuchać Button z jego pliku zasobów układu; następnie mówimy LayoutInflater, że chcemy dołączyć go do mLinearLayout. Nasze parametry układu są honorowane, ponieważ wiemy, że przycisk zostanie dodany do LinearLayout. Typem parametrów układu przycisku powinien być LinearLayout.LayoutParams.
attachToRoot Ustaw na wartość false (nie jest wymagane, aby użyć wartości false)
Jeśli właściwość attachToRoot ma wartość false, plik układu określony w pierwszym parametrze jest zawyżany i nie jest dołączany do grupy ViewGroup określonej w drugim parametrze, ale ten zawyżony widok uzyskuje LayoutParams rodzica, co umożliwia prawidłowe dopasowanie tego widoku do rodzica.
Przyjrzyjmy się, kiedy chcesz ustawić attachToRoot na false. W tym scenariuszu widok określony w pierwszym parametrze inflate () nie jest w tym momencie dołączany do grupy ViewGroup w drugim parametrze.
Przypomnijmy nasz przykład z wcześniejszego przycisku, w którym chcemy dołączyć niestandardowy przycisk z pliku układu do mLinearLayout. Nadal możemy dołączyć nasz przycisk do mLinearLayout, przekazując wartość false dla attachToRoot - po prostu dodajemy go samodzielnie.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Te dwa wiersze kodu są równoważne temu, co napisaliśmy wcześniej w jednym wierszu kodu, gdy przekazaliśmy true dla attachToRoot. Przekazując fałsz, mówimy, że nie chcemy jeszcze dołączać naszego widoku do głównej grupy ViewGroup. Mówimy, że stanie się to w innym momencie. W tym przykładzie innym momentem jest po prostu metoda addView () zastosowana bezpośrednio poniżej inflacji.
Fałszywy przykład attachToRoot wymaga nieco więcej pracy, gdy ręcznie dodamy widok do grupy ViewGroup.
attachToRoot Ustaw na wartość false (wymagana jest wartość false)
Podczas nadmuchiwania i zwracania widoku fragmentu w funkcji onCreateView (), należy podać wartość false dla parametru attachToRoot. Jeśli podasz true, otrzymasz IllegalStateException, ponieważ określone dziecko ma już rodzica. Powinieneś określić, gdzie widok Twojego Fragmentu zostanie umieszczony z powrotem w Twojej Aktywności. Zadaniem FragmentManager jest dodawanie, usuwanie i zastępowanie Fragmentów.
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.root_viewGroup);
if (fragment == null) {
fragment = new MainFragment();
fragmentManager.beginTransaction()
.add(R.id.root_viewGroup, fragment)
.commit();
}
Kontener root_viewGroup, który przechowa Twój Fragment w Twojej Aktywności, jest parametrem ViewGroup podanym w funkcji onCreateView () w Twoim Fragmentie. Jest to także grupa ViewGroup, którą przekazujesz do LayoutInflater.inflate (). FragmentManager poradzi sobie jednak z dołączaniem Widoku Fragmentu do tej grupy ViewGroup. Nie chcesz dołączać go dwa razy. Ustaw attachToRoot na false.
public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, parentViewGroup, false);
…
return view;
}
Dlaczego otrzymujemy nadrzędną grupę ViewGroup naszego Fragmentu, jeśli nie chcemy dołączać jej do funkcji onCreateView ()? Dlaczego metoda inflate () żąda głównej grupy ViewGroup?
Okazuje się, że nawet jeśli nie dodajemy od razu naszego świeżo napompowanego Widoku do jego nadrzędnej grupy ViewGroup, powinniśmy nadal używać LayoutParams rodzica, aby nowy widok mógł określić jego rozmiar i pozycję, gdy tylko zostanie ostatecznie dołączony.
Link: https://youtu.be/1Y0LlmTCOkM?t=409