LayoutInflater tager HML-filen som input og bygger Visningsobjekter fra den. Fair nok forstod vi, hvad LayoutInflater gør.
lad os se, hvad LayoutInflater.pump () dokument siger og specielt om attachToRoot.
boolsk: om det oppustede hierarki skal knyttes til rodparameteren? Hvis det er falsk, bruges root kun til at oprette den korrekte underklasse af LayoutParams til rodvisningen.
den generelle ide er dette: hvis attachToRoot er indstillet til true, så er layoutfilen angivet i den første parameter oppustet og knyttet til den Visningsgruppe, der er angivet i den anden parameter.
når attachToRoot er falsk, opblæses layoutfilen fra den første parameter og returneres som en visning. Betyder rod bruges kun til at oprette den korrekte underklasse af LayoutParams for rodvisningen(af første parameter) i den.
aflevering af true for attachToRoot resulterer i, at en layoutfils oppustede visning føjes til Visningsgruppen lige på stedet. Passing i false for attachToRoot betyder, at visningen oprettet fra layoutfilen vil blive tilføjet til Visningsgruppen på en anden måde.
lad os bryde det ned i to scenarier:
attachToRoot sæt til True
- Forestil dig, at vi har angivet en knap i en layoutfil med dens layoutbredde og layouthøjde indstillet til 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>
- vi vil nu programmatisk tilføje denne knap til en Lineærlayout inde i en aktivitet. I Vores LinearLayout – medlemsvariabel forælder kan vi blot tilføje knappen med følgende:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- vi specificerede, at vi vil puste Knappen op fra dens layoutressourcefil; vi fortæller derefter LayoutInflater, at vi vil vedhæfte den til forælder. Vores layout parametre er hædret, fordi vi ved, at knappen bliver tilføjet til en LinearLayout. Knappens layout params type skal være Lineærlayout.LayoutParams.
2. attachToRoot indstillet til False
- lad os se på, hvornår du vil indstille attachToRoot til false. I dette scenario er den visning, der er angivet i den første parameter for oppustning (), ikke knyttet til Visningsgruppen i den anden parameter på dette tidspunkt. Husk vores Knapeksempel fra tidligere, hvor vi vil vedhæfte en brugerdefineret knap fra en layoutfil til forælder. Vi kan stadig vedhæfte vores knap til forælder ved at passere false for attachToRoot — vi tilføjer det manuelt selv bagefter.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- det falske attachToRoot-eksempel kræver lidt mere arbejde, når vi manuelt tilføjer visningen til en Visningsgruppe. Tilføjelse af vores knap til vores LinearLayout var mere praktisk med en linje kode, når attachToRoot var sandt.
- lad os se på nogle scenarier, der absolut kræver, at attachToRoot er falsk. Recyclervis børn bør opblæses med attachToRoot passeret ind som falsk. Barnets synspunkter er oppustet i oncreatevieholder (). Genbrugsvisninger, ikke os, er ansvarlige for at bestemme, hvornår de skal puste op og præsentere sine børns synspunkter. Parameteren attachToRoot skal være falsk, når som helst vi ikke er ansvarlige for at tilføje en visning til en Visningsgruppe.
- der er et par scenarier, hvor du ikke har en rodvisningsgruppe, der skal overføres til oppustning(). Når du opretter en brugerdefineret visning for en AlertDialog, har du endnu ikke adgang til dens overordnede.
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();
- i dette tilfælde er det okay at videregive null til rodvisningsgruppen. Det viser sig, at AlertDialog alligevel ville tilsidesætte eventuelle LayoutParams til match_parent. Den generelle tommelfingerregel er dog at passere i forælderen, hvis du er i stand til det.
så at opsummere:
- hvis du har en forælder til at gå ind i rodvisningsgruppeparameteren, skal du gøre det.
- prøv at undgå at passere null for rodvisningsgruppen.
- Pass ind falsk for parameteren attachToRoot, når vi ikke er dem, der er ansvarlige for at vedhæfte vores layoutfils visning til dens rodvisningsgruppe.
- Indsæt ikke true for en visning, der allerede er knyttet til en Visningsgruppe.
- Brugerdefinerede visninger er en god brugssag til at passere sandt for attachToRoot.
særlig tak til Sean Farrel, om hans vidunderlige artikel om LayoutInflater her forsøgte jeg at opsummere med få ord.
glad kodning og skrivning om kodning!
hvis du fandt dette nyttigt, skal du klikke på den højre side. Følg mig for flere artikler om teknologi.