#android #layout
#Android #макет
Вопрос:
В моем приложении есть TableLayout, которое мне нужно определить и добавить программно, поскольку оно основывается на выходных данных SQL-запроса. В принципе, результат должен выглядеть аналогично расписанию (7 столбцов на каждый день недели, несколько строк для разных временных интервалов в день). Для ячеек / временных интервалов мне просто нужны обычные представления с определенным цветом фона.
Проблема в том, что все представления в конечном итоге имеют высоту и ширину 0, хотя определены иначе. Что я делаю не так?
Код:
RelativeLayout.LayoutParams tableLayout = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
tableLayout.addRule(RelativeLayout.BELOW, R.id.myOtherLayout);
tableLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
TableLayout table = new TableLayout(this);
table.setBackgroundColor(Color.WHITE);
table.setMinimumHeight(PixelConverter.pxToSp(this, 240));
// get availability table data
int[][] tableData = getTableData(...);
if (availability != null) {
// init array of tablerows, which represent one line each for every timeslot
for (int timeSlot = 0; timeSlot < 12; h ) {
// init row
TableRow newRow = new TableRow(this);
newRow.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, // width
10)); // height
newRow.setMinimumHeight(10);
// create 7 views in each row - one for each day in a week
for (int day = 0; day < 7; d ) {
View v = new View(this);
v.setLayoutParams(new LinearLayout.LayoutParams(
10, // TODO width
10)); // height
v.setMinimumWidth(10);
v.setMinimumHeight(10);
int cellHue = tableData[day][timeSlot];
if (cellHue >= 0) {
v.setBackgroundColor(Color.HSVToColor(new float[] { cellHue, 100, 100 }));
} else {
v.setBackgroundColor(Color.TRANSPARENT);
}
// add view to tablerow
newRow.addView(v, day);
}
table.addView(newRow, timeSlot);
}
}
table.setId(R.id.my_table_id);
mainLayout.addView(table, tableLayout);
Ответ №1:
Я столкнулся с аналогичной проблемой — проблема, похоже, связана с выбором типа LayoutParams
, используемого после раздувания ваших представлений. В частности, корнем вашей проблемы, вероятно, является следующее:
View v = new View(this);
v.setLayoutParams(new LinearLayout.LayoutParams(
10, // TODO width
10)); // height
Я бы посоветовал вам попробовать:
View v = new View(this);
v.setLayoutParams(new TableRow.LayoutParams(
10, // TODO width
10)); // height
Ключ в том, что вам, очевидно, следует указать тип родительского представления при использовании LayoutParams
, а не тип представления, на которое вы их настраиваете. Обратите внимание, что в этом случае вам, вероятно, также потребуется указать TableLayout.LayoutParams
при вызове setLayoutParams
в вашей строке.
Я не знаю, насколько хорошо это задокументировано — я заметил, что это упоминается в произвольном блоге, который я нашел (увы, потерял ссылку сейчас), и у меня еще не было возможности вернуться к официальной документации, но, предположительно, это где-то там … 🙂
Надеюсь, это поможет!
Комментарии:
1. Да, просматриваю документ для LinearLayout: «Установите параметры макета, связанные с этим представлением. Они предоставляют параметры родительскому представлению, определяющему, как оно должно быть организовано. Существует много подклассов ViewGroup. LayoutParams, и они соответствуют различным подклассам ViewGroup, которые отвечают за упорядочивание своих дочерних элементов.»
2. Да, это сработало — спасибо, Мэтт! На самом деле это обходилось по-разному, но я мог бы поклясться, что видел официальный учебник Google, использующий «неправильные» параметры Layout (поэтому подумал, что они более или менее взаимозаменяемы).
3. Да, я довольно новичок в Android, и я видел множество примеров, указывающих на использование неправильных параметров Layout. Ну что ж, в конце концов добрались 🙂