Как отключить оптимизацию макета в Android до 2.2? - PullRequest
1 голос
/ 21 января 2011

Я создал пользовательский компонент на основе 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 Ответ

1 голос
/ 21 января 2011

Нет такой оптимизации.Представление не рисуется, если оно имеет размер 0, не пересекается с прямоугольником отсечения или полностью покрыто непрозрачным представлением.Кстати, макет не будет вызывать свой метод onDraw (), если вы ранее не вызывали setWillNotDraw (false).

Ваша проблема звучит больше как проблема макета.Вы реализовали onMeasure ()?Показ нам соответствующих частей вашей реализации поможет.

...