ui线程-在addView方法之后不显示Android视图



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(50050)无效。我甚至尝试在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中首次选择"活动"时,才会出现"addView bug"。如果第一次从另一个选项卡启动"活动",则一切正常。

我找到了解决方案。如果使用android:animateLayoutChanges="false"关闭布局动画,则一切正常。但我仍然不知道为什么会发生这种事。如果有人知道这种行为的原因,我会很感兴趣。

最新更新