如何在2.2之前的Android中禁用布局优化?

时间:2011-01-21 17:49:18

标签: android optimization layout components

我已经基于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);
    }
}

这允许组件及其内容出现,但虚拟视图的存在搞砸了与组件的交互,并且任何隐藏虚拟的尝试都会导致组件消失。

看起来有人投入了大量精力来创建优化,现在让我花了一整天才能摆脱它。有没有人知道,如果有办法禁用这种“有用的”优化?

1 个答案:

答案 0 :(得分:1)

没有这样的优化。如果视图的大小为0,不与剪切矩形相交或者它完全被不透明视图覆盖,则不会绘制视图。顺便说一下,如果之前没有调用setWillNotDraw(false),布局将不会调用它的onDraw()方法。

您的问题听起来更像是布局问题。你实现了onMeasure()吗?向我们展示实施的相关部分会有所帮助。