我正在编写一个应用程序,其唯一目的是试图了解 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)
TestA的方法永远不会被调用。我已经看到了一些解决方案,即我的视图没有任何尺寸(高度/宽度 = 0),但是事实并非如此。当我覆盖时onLayout()
,我得到了布局的尺寸并且它们是正确的。此外,getHeight()/Width() 完全符合它们应有的状态。我也可以覆盖dispatchDraw()
并让我的基本视图自己绘制。我想在
TestB
. 传统上,我会覆盖onDraw()
调用invalidate()
自身的方法,直到对象完成它应该做的动画。但是,TestB
当我调用视图时invalidate()
,视图永远不会重绘。我的印象是再次调用该方法是我的父视图的工作onDraw()
,但我的父视图不会再次调用该方法dispatchDraw()
。
我想我的问题是,为什么onDraw()
我的父视图方法永远不会被调用?当其中一个孩子使自己失效时,应该调用我父母视图中的哪些方法?父母是负责确保孩子被吸引的人,还是Android会处理这个问题?如果 Android 响应invalidate()
,为什么我TestB
再也不会被绘制?