Создание программы 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. Что я делаю не так?

Чтобы сделать ответ более ясным:

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

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

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

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

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

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