Влияние установки родительского зрения на своих детей - программирование
Подтвердить что ты не робот

Влияние установки родительского зрения на своих детей

Этот вопрос возникает из-за необходимости динамически отображать/скрывать разные представления. View имеют 3 настройки видимости - видимые, невидимые и ушедшие. Если у вас есть родительский вид, например, LinearLayout, который имеет несколько дочерних представлений (неважно, каковы они), устанавливает видимость родительского объекта так же, как и определение видимости для всех детей независимо? Например, если я скажу

LinearLaout container = (LinearLayout) findViewById(R.id.layout_1);
container.setVisiblity(View.GONE);

Это то же самое, что и поиск каждого отдельного дочернего представления и установка всех этих видимости на View.GONE? Что, если родительский элемент не был View.GONE, а View.INVISIBLE? Все ли дети все еще нарисованы, но просто не видели?

4b9b3361

Ответ 1

Эффект одинаков, но на самом деле он не устанавливает видимость всех детей. Он просто их не рисует.

Например:

  • Установите дочерний элемент в GONE (родительский виден, ребенок ушел)

  • Установите родительский GONE (оба ушли)

  • Установите родительский элемент VISIBLE (родительский вид, дочерний объект все еще ушел, поскольку дочерний элемент был явно задан раньше)

  • Установите дочерний элемент VISIBLE (оба видимые)

В любое время, когда представление НЕВИДИМО, оно не будет рисовать его или его детей. Если он GONE, он также не зарезервирует для них место макета. Если вы проверите дочерний элемент getVisibility(), хотя вы увидите, что он по-прежнему настроен на все, что было до этого, даже если он не отображается.

Ответ 2

Да, вы правы во всех точках:)

Настройка видимости макетов для GONE скроет всех детей. Настройка видимости макетов для INVISIBLE сделает всех детей невидимыми, но все еще привлеченными и занимающими пространство.

Ответ 3

Используйте ниже рекурсивную функцию, чтобы сделать ваши дочерние представления видимыми или удален.
Первый аргумент - это ваше родительское представление, а второй аргумент решает, хотите ли вы видеть дочерние родительские представления или исчезнуть. true = visible false = go

private void layoutElemanlarininGorunumunuDegistir(View view, boolean gorunur_mu_olsun) {
    ViewGroup view_group;
    try {
        view_group = (ViewGroup) view;
        Sabitler.konsolaYazdir(TAG, "View ViewGroup imiş!" + view.getId());
    } catch (ClassCastException e) {
        Sabitler.konsolaYazdir(TAG, "View ViewGroup değilmiş!" + view.getId());
        return;
    }

    int view_eleman_sayisi = view_group.getChildCount();
    for (int i = 0; i < view_eleman_sayisi; i++) {
        View view_group_eleman = view_group.getChildAt(i);
        if (gorunur_mu_olsun) {
            view_group_eleman.setVisibility(View.VISIBLE);
        } else {
            view_group_eleman.setVisibility(View.GONE);
        }
        layoutElemanlarininGorunumunuDegistir(view_group_eleman, gorunur_mu_olsun);
    }
}