我见过一些使用addView的小部件,有时候还有addViewInLayout。
他们之间有什么区别? 如果我用另一个替换一个会怎么样?
我应该在布局期间保留一个标志并相应地使用“addViewInLayout”或“addView”吗?
感谢。
BR, 亨利
PS。添加更多标签:removeview,removeviewinlayout
答案 0 :(得分:15)
在addView
内拨打onLayout
通常是一个坏主意,因为addView
会在内部触发requestLayout
,最终会调用onLayout
。因此,当您处于布局中时,最终会触发布局。
addViewInLayout
中添加新视图,则 addView
是onLayout
的“更安全”版本。它基本上不会触发布局传递(不会在内部调用requestLayout)。
有关详细信息,请参阅此视频(由android工程师提供):http://www.youtube.com/watch?v=HbAeTGoKG6k
答案 1 :(得分:4)
addViewInLayout
在布局期间添加视图。如果在onLayout()方法中,您需要添加更多视图(例如列表视图),这非常有用。如果index为负数,则表示将其放在列表的末尾。
<强> addView 强>
将传递的LayoutParams分配给传递的视图,并将视图添加到窗口。
*请注意,addView由ViewManager
实现,这是一个允许您向Activity添加和删除子视图的接口,因此您可以在运行时向ViewGroup添加视图(DYNAMICALLY)。另请注意,addViewInLayout是ViewGroup的受保护方法,因此,如果您要创建自定义视图组,则可以使用addViewInLayout()
方法调用onLayout()
。
有关详情,请参阅this
答案 2 :(得分:1)
例如:我们有一个布局(mLayout),你想在这个布局中添加2个视图(view1,view2)。所以有两种方式(相同)
case1:只需使用以下命令
mLayout.addView(view1); //onLayout() will be called first time
mLayout.addView(view2); //onLayout() will be called second time after the first time.
在这种情况下,你不关心onLayout()函数。它是简单的源代码。
案例2:复杂但性能更好
//do something to <global variable>
bCheck = true; //check it in fuction onLayout()
requestLayout(); //use this function to call onLayout() function for only one time
//in onLayout() function of mLayout, you use addViewInLayout()
//addViewInLayout() dont call onLayout() function, so you can add 2 views with only one time to call onLayout()
//onLayout() is abstract function, so mLayout is a instant of subclass of ViewGroup (ex: RelativeLayout, LinearLayout....)
@Override
onLayout(boolean changed, int l, int t, int r, int b)
if(bCheck == true){
v.addViewInLayout(view1); //add view1 to mLayout
v.addViewInLayout(view1); //add view2 to mLayout
bCheck = false;
}
}
});
我没时间测试它。任何人都可以帮助我说清楚。