我正在编写一个应用程序,其目的只是试图了解Android中的视图层次结构的工作原理。我现在有一些非常严酷的问题。我会尽量在我的解释中简洁一些。试图了解视图层次结构
设置:
目前我有三个意见。 2是ViewGroups
,1只是View
。比方说,他们是按以下顺序:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
在我Activity
我只是显示,像这样的观点:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
问题:
种皮的
onDraw(Canvas canvas)
方法是永远调用。我已经看到这个说法的一些解决方案,我的观点没有任何尺寸(高度/宽度= 0),但是,情况并非如此。当我覆盖onLayout()
时,我得到了我的布局的尺寸,它们是正确的。另外,getHeight()/ Width()与它们应该完全相同。我也可以覆盖dispatchDraw()
并获得我的基本观点来绘制自己。我想动画
TestB
中的对象。传统上,我会在调用invalidate()
时自己覆盖onDraw()
方法,直到对象完成本应该执行的动画。但是,在TestB
中,当我拨打invalidate()
时,该视图永远不会重绘。我的印象是,我的父视图的工作再次调用onDraw()
方法,但我的父视图不再调用dispatchDraw()
。
我想我的问题是,为什么就永远也不会打电话给我我父视图onDraw()
方法来开始?当我的父视图中的某个方法在其中一个孩子失效时应该调用什么方法?父母是否负责确保孩子被吸引,或者Android是否负责照顾?如果Android响应invalidate()
,为什么我的TestB
永远不会再被绘制?
你可以在你的博客中分享这个Viewgroup的演示项目吗?或者它会是非常有用的地方..谢谢你的伙伴.. – user1201239
即使我们在XML中指定它,我是否需要添加childView? – user1201239
对不起。我没有博客或任何要上传的内容。我会尽力尽可能地提供帮助。回答你的第一个问题,不。当你膨胀xml时,这个孩子被包含在'ViewGroup'中。最早可以检索它的是'onFinishInflate()'。之后,你有一个选择。或者通过'getChildAt(int index)'方法让你的孩子或者使用'findViewById(int id)'。索引将是孩子在xml中的顺序。我不知道索引是如何与儿童内的孩子一起工作的。 – DeeV