2

我花了一整天的时间调试各种将自定义添加ViewGroup到另一个自定义中的方法,ViewGroup并且几乎发疯了,因为它们都不起作用,并且没有官方文档或示例可以显示它是如何完成的......

基本上,我有 2 个自定义ViewGroup

  1. HorizontalDockView延伸ViewGroup
  2. GameEntryView延伸FrameLayout

HorizontalDockView覆盖onDraw,onMeasure等,一切都被正常调用并完美运行。但是,当我GameEntryView从内部HorizontalDockView的构造函数中创建并调用addView(gameEntryView)时,无论从任何线程调用的,或者我在 parent 上调用、加载和 setContentView 的情况gameEntryView如何,都将永远不会显示。如果我列出所有对象仍然存在。layoutParamsaddViewHorizontalDockViewhorizontalDockView.getChildAt();gameEntryView

绝望,我尝试通过 GameEntryView 的onDraw, onMeasure,dispatchDraw方法进行调试,并意识到它们实际上都没有被调用!不……一次也没有!

我是否需要遍历父级(Horizo​​ntalDockView) on* 调用中的所有子视图并显式调用子级 on*?我只是在父级上调用 super.on*() 。

我确实调用setWillNotDraw( false );了父类和子类。

如何让孩子出现在父母的视野中?非常感谢简单的示例或现有的小型开源项目!

非常感谢!

4

1 回答 1

5

你覆盖了onLayout吗?当 Android 布置 your 时ViewGroup,yourViewGroup负责布置孩子。

这段代码来自一个自定义的 ViewGroup,它把所有的孩子放在一起:

@Override
protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) {

    int count = this.getChildCount();
    for (int i = 0; i < count; i++) {

        View child = this.getChildAt(i);
        child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
    }
}

为了完整起见,onMeasure覆盖:

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {

    int parentWidth  = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight);

    int count = this.getChildCount();
    for (int i = 0; i < count; i++) {

        View child = this.getChildAt(i);
        this.measureChild(
            child,
            MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.EXACTLY));
    }
}
于 2013-07-09T09:54:46.077 回答