我在使桌子看起来像我想要的时候有点麻烦。
这些是几个问题,但是由于它们都是参考下图和我提供的详细信息,因此我认为它们都应该放在一个帖子中。

这是我到目前为止所取得的成就:



标题行包含一个Button类型的元素。

    TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);
    mHeader.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
    addView(mHeader);


该表的其余部分按以下方式填充:
(Messagerow扩展了TableRow并具有TextView成员)

        for(int i = 0; i < 100; i++) {
            MessageRow mr = new MessageRow(getContext());
            // stuff to set the TexView text and color
            mr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
            this.addView(mr);
        }



1.如何使标题行的高度更像行?

2.如何使按钮占据行的整个宽度?
如果表为空,则没有文本行,而是标题,则按钮匹配行宽。一旦添加一行文本,就会调整列宽,但不会调整按钮宽度。

3.如何使行填充屏幕宽度? (MATCH_PARENT不这样做)

4.如何在表格行之间画一条细线?
我试图覆盖MessageRow上的onDraw()函数,但是它从未被调用,甚至没有被调用过。

不要误会我的意思。我不是要你为我做我的工作。这些是我自己尝试解决的问题,在Google上搜索并阅读了类似的文章,但没有找到答案。注意:我发现Android版Javascript中的UI设计缺乏对所有这些小细节的清晰控制和清晰文档。

编辑
这是我创建表的方式:

    TableLayout mTable = new TableLayout(this);

    HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);

    populate(mTable);
    mTable.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    mTable.setBackgroundColor(Color.WHITE);

    hview.addView(mTable);

最佳答案

如何使标题行的高度更像行?
  


使用默认的Button没什么可做的。 Button使用九个补丁的图像,该图像在按钮的文本和您看到的边框之间有一定的间隔。您可以使用较小的字体,但看起来可能很难看。要尝试的另一件事是使用您自己的Button背景,并摆脱默认的多余空间(默认的9像素图像),使最终高度接近TextView文本的高度。或者尝试使用固定值对所有行强制使用标准高度。


  
  如何使按钮占据行的整个宽度?
  


我认为您在TextView中有一个以上的MessageRow,因此当您添加Button时,它将移至第一列(对应于第一TextView)。如果是这种情况,请使您的Button跨越表示TextViewsMessageRow数量的列数:

TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
params.span = 3; // if you have 3 `TextView` in the MessageRow
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);


如果不是这种情况,请添加更多详细信息。


  
  如何使行填满屏幕宽度? (MATCH_PARENT不这样做)
  


正如我在您以前的一个问题中所说的那样,我不知道为什么会这样(但是我为您提供了一些解决此问题的解决方案)。也:


mHeader和另一个MessageRowTablelayout的子级,并且在其上使用的正确LayoutParams是父级的LayoutParamsTableLayout.LayoutParams而不是TableRow.LayoutParams
您在TextView中添加了一些MessageRow(从我之前的问题中看到的内容开始),然后将带有TableRow.LayoutParams的子视图添加到MessageRow中。
您在代码中的任何地方仅对WRAP_CONTENT使用LayoutParams,您可能希望将宽度(构造函数中的第一个参数)设置为FILL_PARENT / MATCH_PARENT



  
  如何在表格行之间画一条细线?
  


您可以使用一个简单的View作为分隔符:

for(int i = 0; i < 100; i++) {
   MessageRow mr = new MessageRow(getContext());
   // stuff to set the TexView text and color
   mr.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
   this.addView(mr);
   View separator = new View(getContext());
   separator.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, 3)));
   separator.setBackgroundColor(Color.RED);
   this.addView(separator);
}


因为您有100行,所以您可以尝试设置带有分隔线的可绘制对象作为TableRowheaderMessageRow)的背景,而不是上述方法在布局中添加另外100个视图。

特别提示:

您有很多要添加到单个活动布局的视图,您说的是100行,并且如果您的MessageRow比简单的TextView更复杂(我认为是),那么您可能会遇到一些性能问题。我建议您看一下精彩的ListView小部件。

07-27 14:29