我在使桌子看起来像我想要的时候有点麻烦。
这些是几个问题,但是由于它们都是参考下图和我提供的详细信息,因此我认为它们都应该放在一个帖子中。
这是我到目前为止所取得的成就:
标题行包含一个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
跨越表示TextViews
中MessageRow
数量的列数:
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
和另一个MessageRow
是Tablelayout
的子级,并且在其上使用的正确LayoutParams
是父级的LayoutParams
:TableLayout.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行,所以您可以尝试设置带有分隔线的可绘制对象作为
TableRow
(header
和MessageRow
)的背景,而不是上述方法在布局中添加另外100个视图。特别提示:
您有很多要添加到单个活动布局的视图,您说的是100行,并且如果您的
MessageRow
比简单的TextView
更复杂(我认为是),那么您可能会遇到一些性能问题。我建议您看一下精彩的ListView
小部件。