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