Программно добавленные представления в TableLayout / TableRow имеют высоту и ширину 0

#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. Ну что ж, в конце концов добрались 🙂