1

我有一个自定义 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 并重新布局孩子?或任何其他解决方案...

4

1 回答 1

0

如果有人仍然有这个问题,我的解决方案是解决 onLayout 中的所有子视图:

  • 设置可见性 = View.VISIBLE 并在我要显示的内容上调用布局
  • 为我想要隐藏的那些设置可见性 = View.GONE(并且不要在它们上调用布局)。如果它们已经在那里,你不能只是不布置它们。

或者,其他人建议您可以覆盖 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() 函数!所以,虽然这看起来更干净,但我仍然缺少一些东西......

于 2019-01-25T19:13:02.797 回答