我已经基于LinearLayout创建了一个自定义组件。我们的想法是将其作为XML布局的一部分,例如:
<com.test.MyComponent
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
/>
在运行时,组件动态创建其内容(通过添加View子类的实例)。这在Android 2.2和2.3上运行得非常好,但在早期的平台上,组件根本不显示。我花了很多时间弄清楚为什么它会消失,最后能够找出原因。
在2.2之前的平台上,Android进行了“聪明”的优化。它指出XML布局中使用的自定义类是一个LinearLayout,它没有任何子代 - 所以它根本不打扰它。
我尝试了很多解决方法。唯一一个或多或少成功的是向组件添加一个虚拟视图,因此它不是空的:
<com.test.MyComponent
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
>
<View
android:layout_width="1px"
android:layout_height="1px"
/>
</com.test.MyComponent>
然后在组件的代码中添加以下覆盖:
protected void dispatchDraw (Canvas canvas) {
super.dispatchDraw(canvas);
for (ChildView c : children) {
c.draw(canvas);
}
}
这允许组件及其内容出现,但虚拟视图的存在搞砸了与组件的交互,并且任何隐藏虚拟的尝试都会导致组件消失。
看起来有人投入了大量精力来创建优化,现在让我花了一整天才能摆脱它。有没有人知道,如果有办法禁用这种“有用的”优化?
答案 0 :(得分:1)
没有这样的优化。如果视图的大小为0,不与剪切矩形相交或者它完全被不透明视图覆盖,则不会绘制视图。顺便说一下,如果之前没有调用setWillNotDraw(false),布局将不会调用它的onDraw()方法。
您的问题听起来更像是布局问题。你实现了onMeasure()吗?向我们展示实施的相关部分会有所帮助。