de lucru de LayoutInflater | Android

LayoutInflater ia fișier XML ca o intrare și construiește vedere obiecte din ea. Destul de corect am înțeles ce face LayoutInflater.

să vedem ce LayoutInflater.umfla () documentul spune și în special despre attachToRoot.

boolean: dacă ierarhia umflate ar trebui să fie atașat la parametrul rădăcină? Dacă false, root este utilizat numai pentru a crea subclasa corectă a LayoutParams pentru vizualizarea rădăcină în XML.

ideea generală este aceasta: dacă attachToRoot este setat la true, atunci fișierul de aspect specificat în primul parametru este umflat și atașat la grupul de vizualizare specificat în al doilea parametru.

când attachToRoot este fals, fișierul de aspect din primul parametru este umflat și returnat ca vizualizare. Înseamnă rădăcină este utilizat numai pentru a crea subclasa corectă a LayoutParams pentru vizualizarea rădăcină(de primul parametru) în XML.

trecerea în true pentru attachToRoot duce la vizualizarea umflată a unui fișier de aspect adăugat la grupul de vizualizare chiar la fața locului. Trecerea în Fals pentru attachToRoot înseamnă că vizualizarea creată din fișierul layout va fi adăugată la grupul de vizualizare într-un alt mod.

să o descompunem în două scenarii:

break-l jos

attachToRoot setat la True

  • Imaginați-vă am specificat un buton într-un fișier de aspect XML cu lățimea de aspect și înălțimea de aspect setat la 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>
  • acum vrem să adăugăm programatic acest buton la un LinearLayout în interiorul unei activități. În părintele nostru variabil membru LinearLayout, putem adăuga pur și simplu butonul cu următoarele:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
  • am specificat că dorim să umflăm butonul din fișierul său de resurse de aspect; apoi îi spunem LayoutInflater-ului că dorim să-l atașăm la părinte. Parametrii noștri de aspect sunt onorați, deoarece știm că butonul este adăugat la un LinearLayout. Tipul de aspect al butonului params ar trebui să fie LinearLayout.LayoutParams.

2. attachToRoot setat la False

  • să aruncăm o privire la momentul în care doriți să setați attachToRoot la false. În acest scenariu, vizualizarea specificată în primul parametru de umfla() nu este atașat la ViewGroup în al doilea parametru în acest moment în timp. Reamintim exemplul nostru de buton de la mai devreme, unde dorim să atașăm un buton personalizat dintr-un fișier de aspect la părinte. Putem atașa în continuare butonul nostru la părinte, trecând în Fals pentru attachToRoot — doar îl adăugăm manual după aceea.

Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
  • exemplul fals attachToRoot necesită un pic mai mult de lucru atunci când adăugăm manual vizualizarea la un grup de vizualizări. Adăugarea butonului nostru la LinearLayout a fost mai convenabilă cu o linie de cod atunci când attachToRoot era adevărat.
  • să ne uităm la unele scenarii care necesită absolut attachToRoot să fie false. Copiii RecyclerView ar trebui să fie umflate cu attachToRoot trecut ca fals. Opiniile copilului sunt umflate în onCreateViewHolder (). RecyclerViews, nu noi, suntem responsabili pentru a determina când să umflăm și să prezentăm opiniile copilului. Parametrul attachToRoot ar trebui să fie fals oricând nu suntem responsabili pentru adăugarea unei vizualizări la un grup de vizualizări.
  • există câteva scenarii în care nu veți avea un grup de vizualizare rădăcină pentru a trece în umfla(). Când creați o vizualizare particularizată pentru un AlertDialog, nu aveți încă acces la părintele său.
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();
  • în acest caz, este bine să treacă în null pentru ViewGroup rădăcină. Se pare că AlertDialog ar suprascrie orice LayoutParams pentru a match_parent oricum. Cu toate acestea, regula generală este de a trece în părinte, dacă sunteți în stare să facă acest lucru.

deci, pentru a recapitula:

  1. dacă aveți un părinte pentru a trece în parametrul Root ViewGroup, faceți acest lucru.
  2. încercați să evitați trecerea în null pentru grupul de vizualizare rădăcină.
  3. treceți în Fals pentru parametrul attachToRoot atunci când nu suntem cei responsabili pentru atașarea vizualizării fișierului nostru de aspect la grupul de vizualizare rădăcină.
  4. nu treceți în true pentru o vizualizare care a fost deja atașată unui grup de vizualizări.
  5. vizualizări personalizate sunt un caz de Utilizare bun pentru a trece în true pentru attachToRoot.

mulțumiri speciale lui Sean Farrel, despre articolul său minunat pe LayoutInflater aici am încercat să rezume în câteva cuvinte.

codificare fericit și scris despre codificare!
dacă vi s-a părut util, faceți clic pe butonul de mai jos. Urmați-mă pentru mai multe articole despre tehnologie.

You might also like

Lasă un răspuns

Adresa ta de email nu va fi publicată.