Der LayoutInflater verwendet eine XML-Datei als Eingabe und erstellt daraus Ansichtsobjekte. Fairerweise haben wir verstanden, was LayoutInflater tut.
Mal sehen, was LayoutInflater.inflate() Dokument sagt und speziell über attachToRoot.
boolean: Ob die aufgeblasene Hierarchie an den Root-Parameter angehängt werden soll? Wenn false , wird root nur verwendet, um die richtige Unterklasse von LayoutParams für die Root-Ansicht in der XML zu erstellen.
Die allgemeine Idee lautet: Wenn attachToRoot auf true gesetzt ist, wird die im ersten Parameter angegebene Layoutdatei aufgeblasen und an die im zweiten Parameter angegebene Ansichtsgruppe angehängt.
Wenn attachToRoot false ist, wird die Layoutdatei aus dem ersten Parameter aufgeblasen und als Ansicht zurückgegeben. Bedeutet, dass root nur verwendet wird, um die richtige Unterklasse von LayoutParams für die Root-Ansicht (des ersten Parameters) in der XML zu erstellen.
Die Übergabe von true für attachToRoot führt dazu, dass die aufgeblasene Ansicht einer Layoutdatei direkt vor Ort zur ViewGroup hinzugefügt wird. Die Übergabe von false für attachToRoot bedeutet, dass die aus der Layoutdatei erstellte Ansicht auf andere Weise zur ViewGroup hinzugefügt wird.
Lassen Sie es uns in zwei Szenarien aufteilen:
attachToRoot auf True gesetzt
- Stellen Sie sich vor, wir haben eine Schaltfläche in einer XML-Layoutdatei angegeben, deren Layoutbreite und Layouthöhe auf 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>
- Wir möchten diese Schaltfläche nun programmgesteuert zu einem LinearLayout innerhalb einer Aktivität hinzufügen. In unserer LinearLayout-Elementvariablen parent können wir einfach die Schaltfläche mit folgendem hinzufügen:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- Wir haben angegeben, dass wir die Schaltfläche aus ihrer Layout-Ressourcendatei aufblasen möchten. Unsere Layoutparameter werden berücksichtigt, da wir wissen, dass die Schaltfläche zu einem LinearLayout hinzugefügt wird. Der Layout-Parametertyp der Schaltfläche sollte LinearLayout .LayoutParams.
2. attachToRoot auf False gesetzt
- Werfen wir einen Blick darauf, wann Sie attachToRoot auf false setzen möchten. In diesem Szenario wird die im ersten Parameter von inflate() angegebene Ansicht zu diesem Zeitpunkt nicht an die ViewGroup im zweiten Parameter angehängt. Erinnern Sie sich an unser Beispiel für Schaltflächen von früher, in dem wir eine benutzerdefinierte Schaltfläche aus einer Layoutdatei an das übergeordnete Element anhängen möchten. Wir können unsere Schaltfläche weiterhin an das übergeordnete Element anhängen, indem wir false für attachToRoot — wir fügen sie danach einfach manuell hinzu.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- Das Beispiel false attachToRoot erfordert etwas mehr Arbeit, wenn wir die Ansicht manuell zu einer Ansichtsgruppe hinzufügen. Das Hinzufügen unserer Schaltfläche zu unserem LinearLayout war mit einer Codezeile bequemer, wenn attachToRoot true .
- Schauen wir uns einige Szenarien an, für die attachToRoot unbedingt false sein muss. Die untergeordneten Elemente von RecyclerView sollten mit attachToRoot aufgeblasen werden, das als false übergeben wird. Die untergeordneten Ansichten werden in onCreateViewHolder () aufgeblasen. RecyclerViews, nicht wir, sind dafür verantwortlich zu bestimmen, wann die untergeordneten Ansichten aufgeblasen und präsentiert werden sollen. Der Parameter attachToRoot sollte immer dann falsch sein, wenn wir nicht für das Hinzufügen einer Ansicht zu einer Ansichtsgruppe verantwortlich sind.
- Es gibt einige Szenarien, in denen Sie keine Root-ViewGroup haben, die an inflate() übergeben werden kann. Wenn Sie eine benutzerdefinierte Ansicht für einen AlertDialog erstellen, haben Sie noch keinen Zugriff auf dessen übergeordnetes Element.
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();
- In diesem Fall ist es in Ordnung, null für die Stammansichtsgruppe zu übergeben. Es stellt sich heraus, dass der AlertDialog alle LayoutParams sowieso auf match_parent überschreiben würde. Die allgemeine Faustregel lautet jedoch, das übergeordnete Element zu übergeben, wenn Sie dazu in der Lage sind.
So zu rekapitulieren:
- Wenn Sie ein übergeordnetes Element in den Parameter root ViewGroup übergeben müssen, tun Sie dies.
- Versuchen Sie zu vermeiden, null für die Stammansichtsgruppe zu übergeben.
- Übergeben Sie false für den Parameter attachToRoot, wenn wir nicht dafür verantwortlich sind, die Ansicht unserer Layoutdatei an die Stammansichtsgruppe anzuhängen.
- Übergeben Sie nicht true für eine Ansicht, die bereits an eine Ansichtsgruppe angehängt wurde.
- Benutzerdefinierte Ansichten sind ein guter Anwendungsfall, um true für attachToRoot zu übergeben.
Besonderer Dank geht an Sean Farrel, über seinen wunderbaren Artikel über LayoutInflater Hier habe ich versucht, in wenigen Worten zusammenzufassen.
Viel Spaß beim Codieren und Schreiben über das Codieren!
Wenn Sie dies hilfreich fanden, klicken Sie auf das 💚 unten. Folgen Sie mir für weitere Artikel über Technologie.