Création de TableLayout par programmation
j'essaie de créer un TableLayout programmatiquement. Il juste ne fonctionnera pas. La même mise en page dans un fichier xml fonctionne bien. C'est ce que j'ai:
public class MyTable extends TableLayout
{
public MyTable(Context context) {
super(context);
setLayoutParams(new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
TableRow row = new TableRow(context);
row.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
Button b = new Button(getContext());
b.setText("hello");
b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
row.addView(b);
addView(row)
}
}
...
// In main activity:
MyTable table = new MyTable(this);
mainLayout.addView(table);
quand je dirige ça, je n'ai pas de crash, mais rien n'apparaît. Si je me débarrasse de L'instance TableRow, au moins le bouton apparaît comme un enfant direct du TableLayout. Ce que je fais mal?
5 réponses
Juste pour rendre la réponse plus claire:
TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableLayout tableLayout = new TableLayout(context);
tableLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));// assuming the parent view is a LinearLayout
TableRow tableRow = new TableRow(context);
tableRow.setLayoutParams(tableParams);// TableLayout is the parent view
TextView textView = new TextView(context);
textView.setLayoutParams(rowParams);// TableRow is the parent view
tableRow.addView(textView);
explication
Lorsque vous appelez setLayoutParams
, vous êtes censé passer le LayoutParams
de la vue parent
il s'avère que j'ai dû spécifier TableRowLayout, TableLayout etc pour les paramètres de mise en page, sinon la table ne s'affichera tout simplement pas!
une bonne solution est de gonfler les fichiers de mise en page pour chaque instance de ligne que vous voulez créer. Voir ce post: comment dupliquer des vues pour peupler des listes et des tables?
Pour moi, pour obtenir le mien j'ai dû appeler addContentView()
.
votre problème est à cette ligne:
b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
vous devez changer LayoutParams
en TableRow.LayoutParams
:
b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));