我有一个自定义ViewGroup和我重写onLayout方法来布局它的子。每次onLayout被调用时都需要一些子元素被布局。问题是,当我调用requestLayout()的孩子,我不布局他们显示从上次调用。
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
.
.
.
// calculate a and b parameter
for (int i = a; i < b ; i++) {
getChildAt(i).layout(l, t ,r ,b );
}
}
问题是如何隐藏从布局或清除ViewGroup和布局的孩子?
如果有人仍然有这个问题,我的解决方案是解决所有的子视图在onLayout:
- set visibility = View。在我想要显示的 上的可见和调用布局
- set visibility = View。对于那些我想要隐藏的(并且不要调用它们的布局)。如果他们已经在那里了,你不能只是不把他们放在那里。
或者,其他人建议你可以重写onDraw并清除画布:
override fun onDraw(canvas: Canvas?) {
// clear if new layout to get rid of unused views:
if(clearCanvas) {
canvas?.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
clearCanvas = false;
}
super.onDraw(canvas)
}
在onLayout中设置clearCanvas = true
,当您知道事情发生了变化时,调用invalidate()
。
然而,我不能让它调用我的onDraw()函数!因此,虽然这看起来更干净,但我仍然缺少一些东西…