Просмотр с состоянием видимости GONE занимает место на экране - PullRequest
7 голосов
/ 04 февраля 2011

У меня возникла проблема, когда представления с состоянием видимости GONE (нежелательно) занимают место на экране.Эта проблема возникает всегда на устройствах уровня API <= 7, но только недавно на устройствах 8+ (после того, как я использовал AsyncTasks для заполнения некоторых полей, согласно <a href="/3508896/pokazyvat-indikator-vypolneniya-kogda-zagruzhaetsya-deistvie"> Отображение индикатора выполнения при загрузке действия )

Немного контекста: я создал собственное представление, расширяющее LinearLayout, которое содержит кнопку «заголовок» и (определяемый пользователем; в некоторых случаях это несколько TextViews, в других это TableLayouts) «содержимое».Целью этого представления является переключение просмотра содержимого onClick кнопки заголовка (я не верю, что для этого есть встроенный виджет .. Я могу ошибаться).

В onLayout ()Я в явном виде устанавливаю состояние видимости всех дочерних представлений, кроме заголовка, GONE при первом рисовании:

protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if(initialDraw) {
        setContentsVisible(false);
        initialDraw = false;
    }
    super.onLayout(changed, l, t, r, b);
}

public void setContentsVisible(boolean visible) {
    for(int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);

        if(child != mTitle) {
            child.setVisibility(visible ? VISIBLE : GONE);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 04 февраля 2011

Перемещение кода из onLayout () в onMeasure () решает проблему.

0 голосов
/ 04 февраля 2011

Я подозреваю, что вы делаете свою жизнь излишне сложной.Сделайте расширяемую часть вашего представления (бит без заголовка с несколькими TextViews или TableLayouts) принадлежащими одному контейнерному представлению - вероятным выбором является FrameLayout - и просто вызовите setVisibility() для этого.

Нет необходимости в цикле, и вы определенно не хотите делать это из onLayout () ... просто сделайте это из onClick().

вашего заголовка.
0 голосов
/ 04 февраля 2011

Хорошо.Я вообще не понимаю, как это что-то привлекает в вашей ситуации.Но я думаю, что вы должны вызвать super.onLayout () после проверки.Например:

protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if(initialDraw) {
        setContentsVisible(false);
        initialDraw = false;
    }
    super.onLayout(l,t,r,b);
}

LinearLayout решает, как расположить дочерние элементы (вертикально или горизонтально) в onLayout (), который вы не вызывали.Более того, после выбора он фактически начинает вычислять, как разметить каждого дочернего элемента, и если видимость дочернего элемента пропала, он пропускает его (это означает, что дочерний элемент не займет никакого места).Я думаю, что в вашем случае детей вообще не выложат и не покажут, но я могу где-то ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...