Create TableLayout programmatically
Asked Answered
S

5

28

I'm trying to create a TableLayout programatically. It just won't work. The same layout in an xml file works though. This is what I have:

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

When I run this, I don't get a crash, but nothing appears. If I get rid of the TableRow instance, at least the button does appear as a direct child of the TableLayout. What am I doing wrong?

Scrub answered 7/10, 2009 at 1:2 Comment(0)
U
42

Just to make the answer more clear:

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

Explanation
When you call setLayoutParams, you are supposed to pass the LayoutParams of the parent view

Ululate answered 21/12, 2012 at 10:52 Comment(5)
Shouldn't it be tableRow.setLayoutParams(rowParams) ?Tadeas
The life saver award goes to @Gigori A. and mark. Gigori A. for this answer and mark for his own answer.Seduce
Great and helpful solution. As a side note, you should add the row to the table before you add the textview to the row. tableLayout.addView(tableRow);Zoon
Spent an hour trying to figure out what I was doing wrong - turns out in your code you missed adding tableRow to the tableLayout: tableLayout.addView(tableRow);Carbonate
@The_Martian. actually, that's not mandatory. it also works first filling the row and then adding the latter to the table. In my strict opinion, that is more intuitive.Annoy
S
6

It turns out I needed to specify TableRowLayout, TableLayout etc for the layout params, otherwise the table just won't show!

Scrub answered 7/10, 2009 at 1:28 Comment(4)
Can you post your code solution? It looks like you are already doing that above.Baucis
Thank you! @Baucis TableRows should use TableLayout.LayoutParams and views inside the TableRows should use TableRow.LayoutParams. :)Veterinary
Horrible that you need to explicitly do this, but it worked for me, thanks!Rosado
Thank you @Brayden! That was the small detail I missed in my subclass of TableLayout that automatically had all TableLayout.LayoutParams and not TableRow.LayoutParams!Hilmahilt
G
1

For me, to get mine I had to call addContentView().

Glottology answered 14/4, 2012 at 4:51 Comment(0)
C
1

A good solution is to inflate layout files for each instance of row you want to create. See this post : How to duplicate Views to populate lists and tables?

Cosgrave answered 11/1, 2014 at 6:39 Comment(0)
O
0

Your problem is at this line:

b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

You need to change LayoutParams to TableRow.LayoutParams:

b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
Otolith answered 9/11, 2016 at 6:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.