attachToRoot Impostato su true:
Se attachToRoot è impostato su true, il file di layout specificato nel primo parametro viene gonfiato e collegato al ViewGroup specificato nel secondo parametro.
Immagina di aver specificato un pulsante in un file di layout XML con la larghezza e l'altezza del layout impostate su 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>
Vogliamo ora aggiungere a livello di codice questo pulsante a un LinearLayout all'interno di un frammento o attività. Se il nostro LinearLayout è già una variabile membro, mLinearLayout, possiamo semplicemente aggiungere il pulsante con il seguente:
inflater.inflate(R.layout.custom_button, mLinearLayout, true);
Abbiamo specificato che vogliamo gonfiare il pulsante dal suo file di risorse di layout; diciamo quindi a LayoutInflater che vogliamo collegarlo a mLinearLayout. I nostri parametri di layout sono rispettati perché sappiamo che il pulsante viene aggiunto a un LinearLayout. Il tipo di parametri del layout del pulsante dovrebbe essere LinearLayout.LayoutParams.
attachToRoot Impostato su false (non necessario per utilizzare false)
Se attachToRoot è impostato su false, il file di layout specificato nel primo parametro viene gonfiato e non collegato al ViewGroup specificato nel secondo parametro, ma quella vista gonfiata acquisisce LayoutParams del genitore che consente a tale vista di adattarsi correttamente al genitore.
Diamo un'occhiata a quando si desidera impostare attachToRoot su false. In questo scenario, la Vista specificata nel primo parametro di inflate () non è collegata al ViewGroup nel secondo parametro in questo momento.
Richiama l'esempio Button precedente, in cui vogliamo allegare un Button personalizzato da un file di layout a mLinearLayout. Possiamo ancora collegare il nostro pulsante a mLinearLayout passando false per attachToRoot: lo aggiungiamo solo manualmente in seguito.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Queste due righe di codice sono equivalenti a quelle che abbiamo scritto in precedenza in una riga di codice quando abbiamo passato true per attachToRoot. Trasmettendo false, diciamo che non vogliamo ancora collegare la nostra vista al gruppo View View. Stiamo dicendo che accadrà in qualche altro momento. In questo esempio, l'altro momento è semplicemente il metodo addView () utilizzato immediatamente sotto l'inflazione.
L'esempio false attachToRoot richiede un po 'più di lavoro quando aggiungiamo manualmente la vista a un ViewGroup.
attachToRoot Impostato su false (è obbligatorio false)
Quando si gonfia e si restituisce la vista di un frammento in onCreateView (), assicurarsi di passare false per attachToRoot. Se passi true, otterrai un IllegalStateException perché il figlio specificato ha già un genitore. Avresti dovuto specificare dove la vista del tuo frammento verrà rimessa nella tua attività. È compito del FragmentManager aggiungere, rimuovere e sostituire i frammenti.
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();
}
Il contenitore root_viewGroup che conterrà il tuo frammento nella tua attività è il parametro ViewGroup che ti è stato dato in onCreateView () nel tuo frammento. È anche il ViewGroup che passi in LayoutInflater.inflate (). Tuttavia, FragmentManager gestirà il collegamento della vista del frammento a questo gruppo di visualizzazione. Non si desidera collegarlo due volte. Impostare attachToRoot su false.
public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, parentViewGroup, false);
…
return view;
}
Perché in primo luogo ci viene dato il ViewGroup genitore del nostro frammento se non vogliamo collegarlo in onCreateView ()? Perché il metodo inflate () richiede un ViewGroup root?
Si scopre che anche quando non stiamo aggiungendo immediatamente la nostra vista gonfiata di recente al suo gruppo di visualizzazione principale, dovremmo comunque utilizzare LayoutParams del padre affinché la nuova vista ne determini le dimensioni e la posizione ogni volta che viene infine collegata.
Link: https://youtu.be/1Y0LlmTCOkM?t=409