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?

5 Answers 5

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

Sign up to request clarification or add additional context in comments.

5 Comments

Shouldn't it be tableRow.setLayoutParams(rowParams) ?
The life saver award goes to @Gigori A. and mark. Gigori A. for this answer and mark for his own answer.
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);
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);
@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.
6

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

4 Comments

Can you post your code solution? It looks like you are already doing that above.
Thank you! @Atma TableRows should use TableLayout.LayoutParams and views inside the TableRows should use TableRow.LayoutParams. :)
Horrible that you need to explicitly do this, but it worked for me, thanks!
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!
1

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

Comments

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?

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.