我有一个奇怪的问题。我从TableRow派生出MessageRow。我用一个TableRow(Header)和100个MessageRows填充了一个表。但是当我将表格添加到HorizontalScroll视图时,只有Messagerows正在显示。 如果我在调试器中检查表,那么所有的行都在那里,包括Header,以及正确的子项和文本。
这是简化的代码:
public class MessageRow extends TableRow {
public TextView tvData1;
public TextView tvData2;
public TextView tvData3;
public MessageRow(Context context) {
this(context, null);
}
public MessageRow(Context context, AttributeSet attrs) {
super(context, attrs);
tvData1 = new TextView(context);
tvData2 = new TextView(context);
tvData3 = new TextView(context);
}
public void setData(String data1, String data2, String data3) {
tvData1.setText(data1);
tvData2.setText(data2);
tvData3.setText(data3);
addView(tvData1);
addView(tvData2);
addView(tvData3);
}
}
活动代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewer);
mTable = new TableLayout(this);
HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);
mTable.setBackgroundColor(Color.WHITE);
populate(mTable);
hview.addView(mTable);
}
public void setHeader(TableLayout tl) {
TableRow mHeader = new TableRow(getContext());
mHeader.addView(getColumnHeader("Data#1"));
mHeader.addView(getColumnHeader("Data#2"));
mHeader.addView(getColumnHeader("Data#3"));
mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
tl.addView(mHeader);
}
public void populate(TableLayout tl) {
setHeader(tl);
for(int i = 0; i < 100; i++) {
MessageRow mr = new MessageRow(getContext());
mr.setMessage("xxx"+i,"yyy"+i,"zzz"+i);
mr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
tl.addView(mr);
}
}
private Button getColumnHeader(String name) {
Button bt = new Button(getContext());
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.rightMargin = params.leftMargin = 2;
bt.setLayoutParams(params);
bt.setText(name);
return bt;
}
现在,我尝试绕过 getColumnHeader()函数,如下所示:
public void setHeader(TableLayout tl) {
TableRow mHeader = new TableRow(getContext());
//mHeader.addView(getColumnHeader("Data#1"));
--> Button bt1 = new Button(getContext());
--> bt1.setText("Data#1");
--> mHeader.addView(bt1);
//mHeader.addView(getColumnHeader("Data#2"));
--> Button bt2 = getColumnHeader("Data#2");
--> mHeader.addView(bt2);
mHeader.addView(getColumnHeader("Data#3"));
mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
tl.addView(mHeader);
}
然后显示bt1(数据#1)!但不是数据#2或数据#3。这暗示了函数 getColumnHeader()不好。但是没有根据调试器的说法,当我检查 bt1和bt2它们看起来不错时,我无法检测到手动实例化的按钮bt1和返回的按钮bt2之间的差异。
旁注:我不知道这是不是最好的方法,但要比较我刚刚右键单击的两个变量和复制变量,然后将它粘贴到两个不同文件中的记事本++(一个用于bt1和一个用于bt2)并使用了比较插件。
答案 0 :(得分:0)
更多信息。
我设法显示按钮,进一步调试显示为函数 getColumnHeader()中的每个按钮设置布局参数导致了问题。
我还是不知道为什么。
按钮成员mLayoutParams为空是可以的,但是当创建( .setLAyoutParams())并指定值(例如宽度和高度)时,突然显示按钮。
这是补丁,......直到我找出原因。
private Button getColumnHeader(String name) {
Button bt = new Button(getContext());
//LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//params.rightMargin = params.leftMargin = 2;
//bt.setLayoutParams(params);
bt.setText(name);
return bt;
}
答案 1 :(得分:0)
最后一块拼图
我尝试了很多变化,最后它起作用了!
用 TableRow.LayoutParams 替换 LayoutParams 可以解决问题。
它们的结构非常相似,甚至可能是TableRow.LayoutParams派生自LayoutParams
我将在这里留下谜团,直到一些专家阐明为什么会发生这种情况。
最终代码:
private Button getColumnHeader(String name) {
Button bt = new Button(getContext());
TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
params.rightMargin = params.leftMargin = 2;
bt.setLayoutParams(params);
bt.setText(name);
return bt;
}