Android - 做ViewGroup onDraw需要迭代子视图并显式调用onDraw吗?

时间:2013-07-09 09:06:56

标签: android android-layout view viewgroup

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

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

  1. HorizontalDockView扩展ViewGroup
  2. GameEntryView扩展FrameLayout
  3. HorizontalDockView会覆盖onDrawonMeasure等等,所有内容都会正常调用并完美运行。 但是,当我从GameEntryView的构造函数中创建HorizontalDockView并调用addView(gameEntryView)时,gameEntryView永远不会显示layoutParams,{{1}从任何线程调用,或者我在父addView上调用,加载和setContentView。如果我通过HorizontalDockView列出所有horizontalDockView.getChildAt();个对象仍在那里。

    绝望,我尝试通过GameEntryView的gameEntryViewonDrawonMeasure方法进行调试,并意识到它们实际上都没有被调用!不......甚至没有一次!

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

    我在父类和子类上都调用了dispatchDraw

    如何让孩子出现在父母的视野中?简单的样本或现有的小型开源项目受到高度赞赏!

    非常感谢!

1 个答案:

答案 0 :(得分:5)

您是否覆盖了onLayout?当Android布局您的ViewGroup时,您的ViewGroup负责布置孩子。

此代码来自自定义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));
    }
}