J'ai étudié ce problème, en me référant aux documents LayoutInflater et en configurant un petit exemple de projet de démonstration. Les didacticiels suivants montrent comment remplir dynamiquement une mise en page à l'aide de LayoutInflater
.
Avant de commencer, voyez à quoi LayoutInflater.inflate()
ressemblent les paramètres:
- resource : ID pour une ressource de mise en page XML à charger (par exemple,
R.layout.main_page
)
- root : vue facultative pour être le parent de la hiérarchie générée (si
attachToRoot
est true
), ou bien simplement un objet qui fournit un ensemble de LayoutParams
valeurs pour la racine de la hiérarchie retournée (si attachToRoot
est false
.)
attachToRoot : si la hiérarchie gonflée doit être attachée au paramètre racine? Si false, root n'est utilisé que pour créer la sous-classe correcte de LayoutParams
pour la vue racine dans le XML.
Renvoie : La vue racine de la hiérarchie gonflée. Si root a été fourni et l' attachToRoot
est true
, c'est root; sinon, c'est la racine du fichier XML gonflé.
Maintenant, pour l'exemple de mise en page et de code.
Disposition principale ( main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Un TextView séparé est ajouté à ce conteneur, visible sous forme de petit carré rouge si les paramètres de mise en page sont correctement appliqués à partir de XML ( red.xml
):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Maintenant LayoutInflater
est utilisé avec plusieurs variantes de paramètres d'appel
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Les résultats réels des variations de paramètres sont documentés dans le code.
SYNOPSIS: Appeler LayoutInflater
sans spécifier la racine conduit à gonfler l'appel en ignorant les paramètres de mise en page du XML. L'appel de inflate avec root n'est pas égal null
et attachRoot=true
charge les paramètres de mise en page, mais renvoie à nouveau l'objet racine, ce qui empêche d'autres modifications de mise en page de l'objet chargé (à moins que vous ne puissiez le trouver en utilisant findViewById()
). La convention d'appel que vous aimeriez probablement utiliser est donc celle-ci:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Pour résoudre les problèmes de mise en page, l' inspecteur de mise en page est fortement recommandé.