attachToRoot Auf true setzen:
Wenn attachToRoot auf true gesetzt ist, wird die im ersten Parameter angegebene Layoutdatei aufgeblasen und an die im zweiten Parameter angegebene ViewGroup angehängt.
Stellen Sie sich vor, wir haben eine Schaltfläche in einer XML-Layoutdatei angegeben, deren Layoutbreite und Layouthöhe auf match_parent festgelegt sind.
<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>
Wir möchten diese Schaltfläche nun programmgesteuert zu einem linearen Layout innerhalb eines Fragments oder einer Aktivität hinzufügen. Wenn unser LinearLayout bereits eine Mitgliedsvariable, mLinearLayout, ist, können wir die Schaltfläche einfach wie folgt hinzufügen:
inflater.inflate(R.layout.custom_button, mLinearLayout, true);
Wir haben angegeben, dass der Button aus seiner Layoutressourcendatei aufgeblasen werden soll. Anschließend teilen wir dem LayoutInflater mit, dass wir es an mLinearLayout anhängen möchten. Unsere Layoutparameter werden berücksichtigt, da wir wissen, dass der Button einem LinearLayout hinzugefügt wird. Der Layoutparametertyp der Schaltfläche sollte LinearLayout.LayoutParams sein.
attachToRoot Auf false setzen (nicht erforderlich, um false zu verwenden)
Wenn attachToRoot auf false gesetzt ist, wird die im ersten Parameter angegebene Layoutdatei aufgeblasen und nicht an die im zweiten Parameter angegebene ViewGroup angehängt. Diese aufgeblasene Ansicht erhält jedoch die LayoutParams des übergeordneten Elements , sodass diese Ansicht korrekt in das übergeordnete Element passt.
Lassen Sie uns einen Blick darauf werfen, 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 Button-Beispiel von früher, in dem wir einen benutzerdefinierten Button aus einer Layoutdatei an mLinearLayout anhängen möchten. Wir können unseren Button weiterhin an mLinearLayout anhängen, indem wir false für attachToRoot übergeben - wir fügen ihn anschließend einfach manuell hinzu.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Diese beiden Codezeilen entsprechen dem, was wir zuvor in einer Codezeile geschrieben haben, als wir true für attachToRoot übergeben haben. Durch die Übergabe von false sagen wir, dass wir unsere Ansicht noch nicht an die Root-ViewGroup anhängen möchten. Wir sagen, dass es zu einem anderen Zeitpunkt passieren wird. In diesem Beispiel ist der andere Zeitpunkt einfach die addView () -Methode, die unmittelbar unterhalb der Inflation verwendet wird.
Das Beispiel "false attachToRoot" erfordert etwas mehr Arbeit, wenn wir die Ansicht manuell zu einer ViewGroup hinzufügen.
attachToRoot Auf false setzen (false ist erforderlich)
Wenn Sie die Ansicht eines Fragments in onCreateView () aufblasen und zurückgeben, müssen Sie false für attachToRoot übergeben. Wenn Sie true übergeben, erhalten Sie eine IllegalStateException, da das angegebene Kind bereits ein Elternteil hat. Sie sollten angegeben haben, wo die Ansicht Ihres Fragments wieder in Ihrer Aktivität platziert werden soll. Es ist Aufgabe des FragmentManagers, Fragmente hinzuzufügen, zu entfernen und zu ersetzen.
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();
}
Der root_viewGroup-Container, der Ihr Fragment in Ihrer Aktivität enthält, ist der ViewGroup-Parameter, den Sie in onCreateView () in Ihrem Fragment erhalten haben. Es ist auch die ViewGroup, die Sie an LayoutInflater.inflate () übergeben. Der FragmentManager übernimmt jedoch das Anhängen der Ansicht Ihres Fragments an diese ViewGroup. Sie möchten es nicht zweimal anhängen. Setzen Sie attachToRoot auf false.
public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, parentViewGroup, false);
…
return view;
}
Warum erhalten wir die übergeordnete ViewGroup unseres Fragments überhaupt, wenn wir sie nicht in onCreateView () anhängen möchten? Warum fordert die inflate () -Methode eine Root-ViewGroup an?
Es stellt sich heraus, dass wir auch dann, wenn wir unsere neu aufgeblasene Ansicht nicht sofort zur übergeordneten ViewGroup hinzufügen, die LayoutParams der übergeordneten Ansicht verwenden sollten, damit die neue Ansicht ihre Größe und Position bestimmen kann, wenn sie schließlich angehängt wird.
Link: https://youtu.be/1Y0LlmTCOkM?t=409