我花了一整天的时间调试各种方法将自定义ViewGroup
添加到另一个自定义ViewGroup
中,并且几乎疯了,因为它们都不起作用,并且没有官方文档或示例显示它如何可以做...
基本上,我有2个自定义ViewGroup
:
HorizontalDockView
扩展ViewGroup
GameEntryView
扩展FrameLayout
HorizontalDockView
会覆盖onDraw
,onMeasure
等等,所有内容都会正常调用并完美运行。
但是,当我从GameEntryView
的构造函数中创建HorizontalDockView
并调用addView(gameEntryView)
时,gameEntryView
永远不会显示layoutParams
,{{1}从任何线程调用,或者我在父addView
上调用,加载和setContentView。如果我通过HorizontalDockView
列出所有horizontalDockView.getChildAt();
个对象仍在那里。
绝望,我尝试通过GameEntryView的gameEntryView
,onDraw
,onMeasure
方法进行调试,并意识到它们实际上都没有被调用!不......甚至没有一次!
我是否需要在*调用中遍历父级(HorizontalDockView)中的所有子视图并在*上显式调用子级?我只是在父母身上调用super.on *()。
我在父类和子类上都调用了dispatchDraw
。
如何让孩子出现在父母的视野中?简单的样本或现有的小型开源项目受到高度赞赏!
非常感谢!
答案 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));
}
}