Создать TableLayout программно - PullRequest
       18

Создать TableLayout программно

25 голосов
/ 07 октября 2009

Я пытаюсь создать TableLayout программно. Это просто не сработает. Хотя тот же макет в XML-файле работает. Вот что у меня есть:

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

Когда я запускаю это, у меня не происходит сбоя, но ничего не появляется. Если я избавлюсь от экземпляра TableRow, то, по крайней мере, кнопка появится как прямой дочерний элемент TableLayout. Что я делаю не так?

Ответы [ 5 ]

33 голосов
/ 21 декабря 2012

Просто чтобы сделать ответ более понятным:

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

Объяснение
Когда вы звоните setLayoutParams, вы должны передать LayoutParams родительского представления

6 голосов
/ 07 октября 2009

Оказывается, мне нужно было указать TableRowLayout, TableLayout и т. Д. Для параметров макета, иначе таблица просто не будет отображаться!

1 голос
/ 11 января 2014

Хорошее решение - накачать файлы макетов для каждого экземпляра строки, которую вы хотите создать. Смотрите этот пост: Как дублировать представления для заполнения списков и таблиц?

0 голосов
/ 09 ноября 2016

Ваша проблема в этой строке:

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

Вам нужно изменить LayoutParams на TableRow.LayoutParams:

b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
0 голосов
/ 14 апреля 2012

Для меня, чтобы получить мой, мне пришлось позвонить addContentView().

...