J'essaie de créer un TableLayout par programme. Ça ne marchera pas. La même disposition dans un fichier XML fonctionne cependant. Voici 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);
Lorsque je lance ceci, je ne reçois pas d'accident, mais rien ne s'affiche. Si je supprime l'instance de TableRow, au moins le bouton apparaît comme un enfant direct de TableLayout. Qu'est-ce que je fais mal?
Juste pour clarifier la réponse:
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 la LayoutParams
de la vue parente
Il s'avère que j'avais besoin de spécifier TableRowLayout, TableLayout, etc. pour les paramètres de présentation, sinon la table ne s'afficherait tout simplement pas!
Une bonne solution consiste à gonfler les fichiers de présentation pour chaque instance de ligne que vous souhaitez créer. Voir cet article: Comment dupliquer des vues pour remplir des listes et des tableaux?
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));
Pour moi, pour obtenir le mien, je devais appeler addContentView()
.