我有一个TableLayout
,里面有多个TableRow
视图。 我希望以编程方式指定行的高度。 例如
int rowHeight = calculateRowHeight();
TableLayout tableLayout = new TableLayout(activity);
TableRow tableRow = buildTableRow();
TableLayout.LayoutParams rowLp = new TableLayout.LayoutParams(
LayoutParams.FILL_PARENT, rowHeight);
tableLayout.addView(tableRow, rowLp);
但这不起作用,默认为WRAP_CONTENT。 在Android源代码中挖掘,我在TableLayout
中看到了这一点(由onMeasure()方法触发):
private void findLargestCells(int widthMeasureSpec) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child instanceof TableRow) {
final TableRow row = (TableRow) child;
// forces the row's height
final ViewGroup.LayoutParams layoutParams = row.getLayoutParams();
layoutParams.height = LayoutParams.WRAP_CONTENT;
似乎任何设置行高的尝试都会被 TableLayout 覆盖。 有人知道解决这个问题的方法吗?
好的,我想我现在已经掌握了窍门。 设置行高的方法不是摆弄连接到TableRow
的TableLayout.LayoutParams
,而是摆弄连接到任何单元格的TableRow.LayoutParams
。 只需将一个单元格设置为所需的高度,(假设它是最高的单元格)整行都将是该高度。 就我而言,我添加了一个额外的 1 像素宽列,设置为所需的高度,这起到了作用:
View spacerColumn = new View(activity);
//add the new column with a width of 1 pixel and the desired height
tableRow.addView(spacerColumn, new TableRow.LayoutParams(1, rowHeight));
首先,您应该使用显示因子公式将其从 dps 转换为像素。
final float scale = getContext().getResources().getDisplayMetrics().density;
int trHeight = (int) (30 * scale + 0.5f);
int trWidth = (int) (67 * scale + 0.5f);
ViewGroup.LayoutParams layoutpParams = new ViewGroup.LayoutParams(trWidth, trHeight);
tableRow.setLayoutParams(layoutpParams);