【发布时间】:2014-05-28 15:17:42
【问题描述】:
我对 ViewGroup.addView() 方法有疑问。我使用此代码向我的布局添加新视图:
TalbeLayout parent = (TableLayout)findViewById(R.id.this_does_not_matter);
parent.removeAllViews(); //this view group contains something at start
TextView tv = new TextView(this);
tv.setText("some text");
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
parent.addView(tv);
然后我看不到我的 TextView。不仅如此, parent.getChildCount() 返回正确的值(如果我尝试添加一个孩子,则为 1)。在父视图的 onClick() 方法中,我尝试获取 TextView 的宽度和高度,所有这些都等于 0。对 TableView 和父视图调用 requestLayout()、invalidate() 和 measure(500, 50) 无效。我什至尝试在 view.post(Runnable) 的帮助下添加新视图,尽管这段代码是在 UI 线程中执行的。
我很困惑。我真的不明白会发生什么。谁能解释一下我做错了什么?
一个有趣的时刻: setLayoutParams() 没有效果。如果我设置宽度=500 和高度=50 的参数,在 onClick 方法中我得到宽度=-1 和高度=-1 的参数。
TableRow 添加后的代码:
TableLayout parent = (TalleLayout)findViewById(R.id.this_does_not_matter);
parent.removeAllViews(); //this view group contains something at start
TextView tv = new TextView(this);
tv.setText("some text");
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(500, 50);
TableRow.LayoutParams tlp = new TableRow.LayoutParams(500, 50);
TableRow tr = new TableRow(this);
tr.addView(tv, tlp);
parent.addView(tr, lp);
parent.invalidate();
parent.requestLayout();
我发现了一件更有趣的事情。此活动从 TabHost 运行。并且只有在此 TabHost 中首次选择 Activity 时才会出现“addView bug”。如果我第一次从另一个选项卡启动 Activity,一切正常。
【问题讨论】:
-
看看这个:stackoverflow.com/a/13988763/833647 看来您需要以编程方式添加
TableRow -
我更改了代码以添加 TableRow,但没有任何改变
-
试试这个:
parent.addView(tv, lp);而不是最后两行(setLayoutParams 和 addView)。还有什么是指this的textview?确保它返回正确的上下文。 -
Fllo,这种方式也行不通。这是指当前的活动
-
你能用新代码编辑你的问题吗?我的意思是动态添加 TableRow。