在TableLayout / TableRow中以编程方式添加的视图的高度和宽度为0

时间:2011-06-03 10:03:02

标签: android layout

我的应用程序中有一个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 个答案:

答案 0 :(得分:2)

我遇到了类似的问题 - 问题似乎是在夸大观看次数后选择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

我不知道这有多少记录 - 我注意到它在我发现的任意博客上提到(现在丢失链接,唉)我还没有机会回到官方文件,但可能是它在某处... :)。

希望这有帮助!