Я создал пользовательский компонент на основе 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);
}
}
Это позволило компоненту и его содержимому появиться, но присутствие фиктивного представления испортило взаимодействие с компонентом, и любая попытка скрыть пустышку приводит к исчезновению компонента.
Внешний видкак кто-то приложил немало усилий для создания оптимизации, которая теперь заставляет меня тратить целый день, чтобы избавиться от нее.Кто-нибудь знает, есть ли способ отключить эту «полезную» оптимизацию?