【发布时间】:2011-06-13 07:40:48
【问题描述】:
我创建了一个基于 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);
}
}
这允许组件及其内容出现,但是虚拟视图的存在扰乱了与组件的交互,任何隐藏虚拟视图的尝试都会导致组件消失。
看起来有人花了很多精力来创建一个优化,现在让我花了一整天的时间来摆脱它。有谁知道,是否有办法禁用这种“有用的”优化?
【问题讨论】:
标签: android optimization layout components