Создание программы 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. Что я делаю неправильно?
Ответы
Ответ 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 и т.д. для параметров макета, иначе таблица просто не появится!
Ответ 3
Хорошим решением является раздувание файлов макета для каждого экземпляра строки, которую вы хотите создать. См. Это сообщение: Как дублировать представления для заполнения списков и таблиц?
Ответ 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));