Подтвердить что ты не робот

Создание программы TableLayout программно

Я пытаюсь создать 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. Что я делаю неправильно?

4b9b3361

Ответ 1

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

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 родительского представления

Ответ 2

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

Ответ 4

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

Ответ 5

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

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