de LayoutInflater neemt XML-bestand als invoer en bouwt er Beeldobjecten van. We begrepen wat LayoutInflater doet.
laten we eens kijken welke LayoutInflater.inflate () document zegt en speciaal over attachToRoot.
boolean: moet de opgeblazen hiërarchie worden gekoppeld aan de root parameter? Als false, wordt root alleen gebruikt om de juiste subklasse van LayoutParams voor de root-weergave in de XML aan te maken.
het algemene idee is dit: als attachToRoot is ingesteld op true, dan wordt het opmaakbestand gespecificeerd in de eerste parameter opgeblazen en gekoppeld aan de ViewGroup gespecificeerd in de tweede parameter.
wanneer attachToRoot onwaar is, wordt het opmaakbestand van de eerste parameter opgeblazen en als weergave geretourneerd. Betekent root wordt alleen gebruikt om de juiste subklasse van LayoutParams voor de rootweergave(van de eerste parameter) in de XML aan te maken.
het waar doorgeven van attachToRoot resulteert in een opgeblazen weergave van een opmaakbestand dat ter plekke aan de Weergavegroep wordt toegevoegd. Het doorgeven van false voor attachToRoot betekent dat de weergave die is gemaakt van het opmaakbestand op een andere manier aan de Weergavegroep wordt toegevoegd.
laten we het in twee scenario ‘ s opsplitsen:
attachToRoot ingesteld op True
- stel je voor dat we een knop specificeren in een XML-opmaakbestand met de opmaakbreedte en opmaakhoogte ingesteld op 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>
- we willen deze knop Nu programmatisch toevoegen aan een LinearLayout binnen een activiteit. In onze LinearLayout member variabele ouder, kunnen we gewoon de knop toevoegen met de volgende:
inflater.inflate(R.layout.view_button, mLinearLayout, true);
- wij specificeerden dat wij de knoop van zijn layoutbronbestand willen opblazen; wij vertellen dan LayoutInflater dat wij het aan parent willen hechten. Onze lay-out parameters worden gehonoreerd omdat we weten dat de knop wordt toegevoegd aan een LinearLayout. Lay-out van de knop params type moet LinearLayout.LayoutParams.
2. attachToRoot Set to False
- laten we eens kijken wanneer u attachToRoot wilt instellen op false. In dit scenario is de weergave gespecificeerd in de eerste parameter van inflate() niet gekoppeld aan de ViewGroup in de tweede parameter op dit punt in de tijd. Herinner ons Knopvoorbeeld van eerder, waar we een aangepaste knop van een opmaakbestand aan de ouder willen toevoegen. We kunnen nog steeds onze Knop hechten aan ouder door het doorgeven van false voor attachToRoot-we gewoon handmatig toe te voegen onszelf daarna.
Button btnAttachToRootFalse = (Button) inflater.inflate(R.layout.view_button,parent,false);
parent.addView(btnAttachToRootFalse);
- het voorbeeld false attachToRoot vereist wat meer werk als we de weergave handmatig toevoegen aan een Weergavegroep. Het toevoegen van onze knop aan onze LinearLayout was handiger met één regel code wanneer attachToRoot waar was.
- laten we eens kijken naar enkele scenario ‘ s die absoluut vereisen dat attachToRoot onwaar is. RecyclerView ‘ s kinderen moeten worden opgeblazen met attachToRoot doorgegeven als vals. Het uitzicht van het kind wordt opgeblazen in onCreateViewHolder (). RecyclerViews, niet wij, zijn verantwoordelijk voor het bepalen wanneer op te blazen en presenteren haar kind standpunten. De attachToRoot parameter moet onwaar zijn wanneer we niet verantwoordelijk zijn voor het toevoegen van een weergave aan een Weergavegroep.
- er zijn een paar scenario ‘ s waarin je geen root ViewGroup hebt om door te geven aan inflate(). Bij het maken van een aangepaste weergave voor een AlertDialog, hebt u nog geen toegang tot de ouder.
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 dit geval is het goed om null door te geven voor de root ViewGroup. Het blijkt dat de AlertDialog elke LayoutParams zou overschrijven naar match_parent hoe dan ook. Echter, de algemene vuistregel is om over te gaan in de ouder als je in staat bent om dit te doen.
samenvatting:
- als je een ouder hebt om door te geven aan de root ViewGroup parameter, doe dat dan.
- probeer het doorgeven van null voor de Hoofdweergavegroep te vermijden.
- geef false door voor de attachToRoot parameter wanneer wij niet verantwoordelijk zijn voor het koppelen van de weergave van ons lay-outbestand aan de Hoofdweergavegroep.
- geef niet waar door voor een weergave die al aan een Weergavegroep is gekoppeld.
- aangepaste weergaven zijn een goede use case om true door te geven voor attachToRoot.
speciale dank aan Sean Farrel, voor zijn prachtige artikel over LayoutInflater hier probeerde ik het in enkele woorden samen te vatten.
Gelukkig coderen en schrijven over coderen!
als u dit nuttig vond, klikt u op de 💚 hieronder. Volg mij voor meer artikelen over technologie.