Layoutflater tar XML-fil som inngang og bygger Visningsobjekter fra den. Rimelig nok forsto vi hva Layoutflater gjor.
La oss se hvilke Layoutflater.blås () dokumentet sier og spesielt om attachToRoot.
boolsk: Om det oppblåste hierarkiet skal knyttes til rotparameteren? Hvis false, brukes root bare til å opprette riktig Underklasse Av LayoutParams for rotvisningen I XML.
den generelle ideen er dette: hvis attachToRoot er satt til true, blir oppsettfilen som er angitt i den første parameteren oppblåst og festet til Visningsgruppen som er angitt i den andre parameteren.
når attachToRoot er usann, blir oppsettfilen fra den første parameteren oppblåst og returnert som En Visning. Means root brukes bare til å lage riktig underklasse Av LayoutParams for rotvisningen (av første parameter) I XML.
Passerer i true for attachToRoot resulterer i en layout fil oppblåst Visning blir lagt Til ViewGroup rett på stedet. Passerer i false for attachToRoot betyr At Visningen opprettet fra layoutfilen vil bli lagt Til ViewGroup på en annen måte.
La oss bryte det ned i to scenarier:
attachToRoot Satt Til True
- Tenk deg at vi angav en knapp i EN XML-layoutfil med layoutbredde og layouthøyde satt 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 nå programmatisk legge Denne Knappen til En Lineærlayout inne I En Aktivitet. I Vår LinearLayout medlem variabel forelder, kan vi bare legge til knappen med følgende:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- vi angav at Vi vil blåse Opp Knappen fra layoutressursfilen; vi forteller Layoutflater at vi vil legge den til foreldre. Våre layout parametere er æret fordi vi vet At Knappen blir lagt Til En Lineærlayout. Knappens layout params type bør Være Lineærlayout.LayoutParams.
2. attachToRoot Satt Til False
- La Oss ta en titt på når du ønsker å sette attachToRoot til false. I dette scenariet Er Visningen som er angitt i den første parameteren i inflate () ikke knyttet Til Visningsgruppen i den andre parameteren på dette tidspunktet. Husk Vårt Knappeksempel fra tidligere, der vi vil legge ved en egendefinert Knapp fra en layoutfil til foreldre. Vi kan fortsatt feste Vår Knapp til foreldre ved å passere i false for attachToRoot – vi bare manuelt legge det selv etterpå.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- false attachToRoot-eksemplet krever litt mer arbeid når vi manuelt legger Visningen til En Visningsgruppe. Legge Vår Knapp Til Vår LinearLayout var mer praktisk med en linje med kode når attachToRoot var sant.
- La oss se på noen scenarier som absolutt krever attachToRoot å være falsk. RecyclerView barn bør blåses opp med attachToRoot gått inn som falsk. Barnevisningene er oppblåst i onCreateViewHolder (). RecyclerViews, ikke oss, er ansvarlige for å bestemme når man skal blåse opp og presentere sine Barns Synspunkter. Den attachToRoot parameter bør være falsk når vi ikke er ansvarlig for å legge En Visning Til En ViewGroup.
- det er noen scenarier der du ikke vil ha en rotvisningsgruppe for å passere inn i inflate (). Når du oppretter en egendefinert Visning for En AlertDialog, har du ennå ikke tilgang til overordnet.
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 tilfellet er det greit å passere i null for root ViewGroup. Det viser seg At AlertDialog ville overstyre Noen LayoutParams til match_parent uansett. Den generelle tommelfingerregelen er imidlertid å passere i foreldrene hvis du kan gjøre det.
så til oppsummering:
- hvis du har en forelder til å passere inn i root ViewGroup-parameteren, gjør du det.
- Prøv å unngå å passere i null for root ViewGroup.
- Pass inn falsk for attachToRoot-parameteren når vi ikke er de som er ansvarlige for å legge ved layoutfilens Syn på rotvisningen.
- ikke pass i true for En Visning som allerede er knyttet til En Visningsgruppe.
- Tilpassede Visninger er en god brukstilfelle å passere i sann for attachToRoot.
Spesiell takk Til Sean Farrel, om hans fantastiske artikkel Om Layoutflater her provde jeg a oppsummere i fa ord.
Glad koding og skriving om koding!
hvis du syntes dette var til hjelp, klikker du på 💚 nedenfor. Følg meg for flere artikler om teknologi.