Влияние установки родительского зрения на своих детей
Этот вопрос возникает из-за необходимости динамически отображать/скрывать разные представления. View имеют 3 настройки видимости - видимые, невидимые и ушедшие. Если у вас есть родительский вид, например, LinearLayout
, который имеет несколько дочерних представлений (неважно, каковы они), устанавливает видимость родительского объекта так же, как и определение видимости для всех детей независимо? Например, если я скажу
LinearLaout container = (LinearLayout) findViewById(R.id.layout_1);
container.setVisiblity(View.GONE);
Это то же самое, что и поиск каждого отдельного дочернего представления и установка всех этих видимости на View.GONE
? Что, если родительский элемент не был View.GONE
, а View.INVISIBLE
? Все ли дети все еще нарисованы, но просто не видели?
Ответы
Ответ 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);
}
}