LayoutInflater tar XML-fil som en ingång och bygger visa objekt från den. Rättvist nog förstod vi vad LayoutInflater göra.
Låt oss se vad LayoutInflater.inflate () dokumentet säger och speciellt om attachToRoot.
boolean: om den uppblåsta hierarkin ska bifogas rotparametern? Om false används root endast för att skapa rätt underklass av LayoutParams för rotvyn i XML.
den allmänna tanken är detta: om attachToRoot är inställd på true, blåses layoutfilen som anges i den första parametern och bifogas den Visningsgrupp som anges i den andra parametern.
när attachToRoot är false blåses layoutfilen från den första parametern upp och returneras som en vy. Medel root används endast för att skapa rätt underklass av LayoutParams för rotvyn(av första parametern) i XML.
passerar i true för attachToRoot resulterar i en layout filens uppblåsta vy läggs till ViewGroup rätt på plats. Passerar i false för attachToRoot innebär att vyn skapas från layoutfilen kommer att få läggas till i ViewGroup på något annat sätt.
Låt oss bryta ner det i två scenarier:
attachToRoot satt till True
- Föreställ dig att vi angav en knapp i en XML-layoutfil med dess layoutbredd och layouthöjd inställd på 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 vill nu programmatiskt lägga till den här knappen i en LinearLayout inuti en aktivitet. I vår LinearLayout medlem variabel förälder, vi kan helt enkelt lägga till knappen med följande:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- vi angav att vi vill blåsa upp knappen från dess layoutresursfil; vi berättar sedan LayoutInflater att vi vill bifoga den till förälder. Våra layoutparametrar är hedrade eftersom vi vet att knappen läggs till i en LinearLayout. Knappens layout params typ ska vara LinearLayout.LayoutParams.
2. attachToRoot inställd på False
- Låt oss ta en titt på när du vill ställa in attachToRoot till false. I det här scenariot är den vy som anges i den första parametern för inflate() inte kopplad till Visningsgruppen i den andra parametern vid denna tidpunkt. Kom ihåg vårt Knappexempel från tidigare, där vi vill bifoga en anpassad knapp från en layoutfil till förälder. Vi kan fortfarande bifoga vår knapp till förälder genom att skicka in false för attachToRoot – vi lägger bara till det manuellt efteråt.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- det falska attachToRoot-exemplet kräver lite mer arbete när vi manuellt lägger till vyn i en Visningsgrupp. Att lägga till vår knapp i vår LinearLayout var bekvämare med en rad kod när attachToRoot var sant.
- Låt oss titta på några scenarier som absolut kräver att attachToRoot är falsk. Recyclerviews barn bör blåsas upp med attachToRoot som passeras som falskt. Barnets åsikter är uppblåsta i onCreateViewHolder (). RecyclerViews, inte oss, är ansvariga för att bestämma när man ska blåsa upp och presentera sina Barnvyer. Parametern attachToRoot ska vara falsk när som helst vi är inte ansvariga för att lägga till en vy i en Visningsgrupp.
- det finns några scenarier där du inte kommer att ha en root ViewGroup att passera in inflate(). När du skapar en anpassad vy för en AlertDialog har du ännu inte tillgång till dess förälder.
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 det här fallet är det okej att skicka in null för root ViewGroup. Det visar sig att AlertDialog skulle åsidosätta alla LayoutParams till match_parent ändå. Den allmänna tumregeln är dock att passera i föräldern om du kan göra det.
så att sammanfatta:
- om du har en förälder att passera in i parametern root ViewGroup, gör det.
- försök att undvika att passera i null för root ViewGroup.
- Pass in false för attachToRoot-parametern när vi inte är ansvariga för att bifoga vår layoutfils vy till dess rotvygrupp.
- passera inte in true för en vy som redan har kopplats till en Visningsgrupp.
- anpassade vyer är ett bra användningsfall att passera i sant för attachToRoot.
särskilt tack till Sean Farrel, om hans underbara artikel om LayoutInflater här försökte jag sammanfatta med några ord.
Glad kodning och skriva om kodning!
om du tyckte att det här var till hjälp, klicka på nedan. Följ mig för fler artiklar om teknik.