Layoutinflater pobiera plik XML jako wejście i buduje z niego obiekty widoku. W porządku, zrozumieliśmy, co robi LayoutInflater.
zobaczmy jaki LayoutInflater.dokument inflate () mówi, a szczególnie o attachToRoot.
boolean: czy zawyżona hierarchia powinna być dołączona do parametru głównego? Jeśli false, root jest używany tylko do tworzenia poprawnej podklasy LayoutParams dla widoku root w XML.
ogólna idea jest taka: jeśli attachToRoot jest ustawiony na true, wtedy plik układu określony w pierwszym parametrze jest zawyżany i dołączany do grupy ViewGroup określonej w drugim parametrze.
gdy attachToRoot jest false, plik układu z pierwszego parametru jest zawyżany i zwracany jako Widok. Oznacza, że root jest używany tylko do stworzenia poprawnej podklasy LayoutParams dla widoku root (pierwszego parametru) w XML.
podanie true dla attachToRoot powoduje dodanie nadmuchanego widoku pliku układu do grupy ViewGroup bezpośrednio na miejscu. Podanie false dla attachToRoot oznacza, że Widok utworzony z pliku układu zostanie dodany do grupy ViewGroup w inny sposób.
Podzielmy to na dwa scenariusze:
attachToRoot ustawiony na True
- wyobraź sobie, że określiliśmy przycisk w pliku układu XML z jego szerokością układu 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="wrap_content"
android:text="@string/action_attach_to_root_true"
android:id="@+id/button_ok">
</Button>
- teraz chcemy programowo dodać ten Przycisk do LinearLayout wewnątrz działania. W naszym rodzicu zmiennej elementowej LinearLayout możemy po prostu dodać przycisk z następującym:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- określiliśmy, że chcemy nadmuchać przycisk z jego pliku zasobów układu; następnie powiemy Layoutinflaterowi, że chcemy dołączyć go do rodzica. Nasze parametry układu są honorowane, ponieważ wiemy, że Przycisk zostanie dodany do LinearLayout. Układ przycisku typu params powinien być LinearLayout.LayoutParams.
2. attachToRoot ustawiony na False
- 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 przycisków z poprzedniego, w którym chcemy dołączyć Niestandardowy przycisk z pliku układu do rodzica. Nadal możemy dołączyć nasz przycisk do rodzica, przekazując false dla attachToRoot – po prostu ręcznie dodajemy go sami.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- fałszywy przykład attachToRoot wymaga nieco więcej pracy, gdy ręcznie dodajemy widok do grupy widoków. Dodanie naszego przycisku Do Naszego LinearLayout było wygodniejsze z jedną linią kodu, gdy attachToRoot był prawdziwy.
- spójrzmy na niektóre scenariusze, które absolutnie wymagają, aby attachToRoot był fałszywy. Dzieci RecyclerView powinny być napompowane attachToRoot przekazanym jako false. Widok potomny jest zawyżany w funkcji oncreateviewholder (). RecyclerViews, a nie my, są odpowiedzialni za określenie, kiedy nadmuchać i przedstawić swoje poglądy potomne. Parametr attachToRoot powinien być false za każdym razem, gdy nie jesteśmy odpowiedzialni za dodanie widoku do grupy ViewGroup.
- istnieje kilka scenariuszy, w których nie będziesz miał głównej grupy ViewGroup do przejścia do inflate(). Podczas tworzenia widoku niestandardowego dla AlertDialog nie masz jeszcze dostępu do jego elementu nadrzędnego.
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();
- w tym przypadku można przekazać null dla głównej grupy ViewGroup. Okazuje się, że AlertDialog i tak nadpisze wszystkie LayoutParams do match_parent. Jednak ogólną zasadą jest, aby przekazać rodzica, jeśli jesteś w stanie to zrobić.
więc podsumowując:
- jeśli masz rodzica do przekazania do głównego parametru ViewGroup, zrób to.
- staraj się unikać przekazywania null dla głównej grupy ViewGroup.
- przekaż false dla parametru attachToRoot, gdy nie jesteśmy odpowiedzialni za dołączenie widoku naszego pliku układu do jego głównej grupy ViewGroup.
- nie przekazuj true dla widoku, który został już dołączony do grupy widoków.
- niestandardowe widoki są dobrym przykładem użycia do przekazania w true dla attachToRoot.
Specjalne podziękowania dla Seana Farrela, o jego wspaniałym artykule na temat LayoutInflater tutaj próbowałem podsumować w kilku słowach.
Szczęśliwego kodowania i pisania o kodowaniu!
jeśli uważasz, że to pomocne, kliknij 💚 poniżej. Śledź mnie po więcej artykułów na temat technologii.