web-dev-qa-db-fra.com

Créer TableLayout par programme

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?

25
mark

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

33
Grigori A.

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!

6
mark

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?

1
clotilde

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));
0
ericn

Pour moi, pour obtenir le mien, je devais appeler addContentView().

0
John Moses