Create TableLayout programmatically

58,616

Solution 1

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

Solution 2

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

Solution 3

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?

Share:
58,616

Related videos on Youtube

mark
Author by

mark

Updated on July 09, 2022

Comments

  • mark
    mark almost 2 years

    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?

  • Atma
    Atma over 12 years
    Can you post your code solution? It looks like you are already doing that above.
  • Brayden
    Brayden almost 12 years
    Thank you! @Atma TableRows should use TableLayout.LayoutParams and views inside the TableRows should use TableRow.LayoutParams. :)
  • Geert Weening
    Geert Weening about 11 years
    Horrible that you need to explicitly do this, but it worked for me, thanks!
  • Anonsage
    Anonsage over 9 years
    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!
  • Leon
    Leon over 8 years
    Shouldn't it be tableRow.setLayoutParams(rowParams) ?
  • Muneeb Mirza
    Muneeb Mirza almost 8 years
    The life saver award goes to @Gigori A. and mark. Gigori A. for this answer and mark for his own answer.
  • The_Martian
    The_Martian over 7 years
    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);
  • Starwave
    Starwave almost 7 years
    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);