Funzionamento di LayoutInflater / Android

Il LayoutInflater prende il file XML come input e costruisce oggetti di visualizzazione da esso. Abbastanza giusto abbiamo capito cosa fare LayoutInflater.

Vediamo cosa LayoutInflater.gonfiare () documento dice e specialmente su attachToRoot.

booleano: se la gerarchia gonfiata deve essere collegata al parametro root? Se false, root viene utilizzato solo per creare la sottoclasse corretta di LayoutParams per la vista root in XML.

L’idea generale è questa: Se attachToRoot è impostato a true, il layout del file specificato nel primo parametro è gonfiato e collegato al ViewGroup specificato nel secondo parametro.

Quando attachToRoot è false, il file di layout del primo parametro viene gonfiato e restituito come Vista. Significa che root viene utilizzato solo per creare la sottoclasse corretta di LayoutParams per la vista root (del primo parametro) nell’XML.

Passando true per attachToRoot si ottiene che la vista gonfiata di un file di layout venga aggiunta al ViewGroup direttamente sul posto. Passare false per attachToRoot significa che la vista creata dal file di layout verrà aggiunta al ViewGroup in qualche altro modo.

facciamo scomposizione in due scenari:

break it down

attachToRoot Impostata su True

  • Immaginare abbiamo specificato un pulsante in XML in un file di layout con la sua larghezza di layout e layout altezza impostata 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>
  • Ora vogliamo aggiungere programmaticamente questo pulsante a un LinearLayout all’interno di un’attività. Nel nostro genitore variabile membro LinearLayout, possiamo semplicemente aggiungere il pulsante con il seguente:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
  • Abbiamo specificato che vogliamo gonfiare il pulsante dal suo file di risorse di layout; quindi diciamo al LayoutInflater che vogliamo collegarlo al genitore. I nostri parametri di layout sono onorati perché sappiamo che il pulsante viene aggiunto a un LinearLayout. Il tipo di parametri di layout del pulsante dovrebbe essere LinearLayout.Parametri di layout.

2. attachToRoot Impostato su False

  • 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 a questo punto nel tempo. Ricorda il nostro esempio di pulsante da prima, dove vogliamo allegare un pulsante personalizzato da un file di layout al genitore. Possiamo ancora collegare il nostro pulsante al genitore passando false per attachToRoot-lo aggiungiamo manualmente noi stessi in seguito.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
  • L’esempio false attachToRoot richiede un po ‘ più di lavoro quando aggiungiamo manualmente la Vista a un ViewGroup. Aggiungere il nostro pulsante al nostro LinearLayout era più conveniente con una riga di codice quando attachToRoot era vero.
  • Diamo un’occhiata ad alcuni scenari che richiedono assolutamente che attachToRoot sia falso. I bambini di RecyclerView dovrebbero essere gonfiati con attachToRoot passato come false. Le viste figlio vengono gonfiate in onCreateViewHolder (). RecyclerViews, non noi, sono responsabili per determinare quando gonfiare e presentare le sue viste figlio. Il parametro attachToRoot dovrebbe essere false ogni volta che non siamo responsabili per l’aggiunta di una vista a un ViewGroup.
  • Ci sono alcuni scenari in cui non si avrà un ViewGroup root da passare in inflate(). Quando si crea una vista personalizzata per un AlertDialog, non si ha ancora accesso al suo genitore.
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 questo caso, va bene passare in null per il ViewGroup root. Si scopre che AlertDialog sovrascriverebbe comunque qualsiasi LayoutParams su match_parent. Tuttavia, la regola generale è quella di passare nel genitore se sei in grado di farlo.

Quindi ricapitolare:

  1. Se hai un genitore da passare al parametro ViewGroup root, fallo.
  2. Cerca di evitare di passare null per il ViewGroup root.
  3. Passare false per il parametro attachToRoot quando non siamo responsabili di allegare la Vista del nostro file di layout al suo ViewGroup root.
  4. Non passare true per una vista che è già stata collegata a un ViewGroup.
  5. Le viste personalizzate sono un buon caso d’uso da passare a true per attachToRoot.

Un ringraziamento speciale a Sean Farrel, a proposito del suo meraviglioso articolo su LayoutInflater che qui ho cercato di riassumere in poche parole.

Felice di codifica e la scrittura di codifica!
Se l’hai trovato utile, fai clic su below qui sotto. Seguitemi per ulteriori articoli sulla tecnologia.

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.