22

这个问题源于必须动态显示/隐藏不同的视图。视图有 3 种可见性设置 - 可见、不可见和消失。如果您有一个父视图,例如 a LinearLayout,它有几个子视图(不管它们是什么),是否将父视图的可见性设置为与独立设置所有子视图的可见性相同?例如,如果我说

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

这与查找每个单独的子视图并将所有这些可见性设置为相同View.GONE吗?如果父母不是View.GONEbutView.INVISIBLE怎么办?是不是所有的孩子都还在画,只是没有看到?

4

3 回答 3

39

效果是一样的,但实际上并没有设置所有孩子的可见性。它只是不会吸引他们。

例如:

  1. 将子项设置为 GONE(父项可见,子项已消失)

  2. 将父级设置为 GONE(均已消失)

  3. 将父级设置为可见(父级可见,子级仍然消失,因为之前明确设置了子级)

  4. 将孩子设置为可见(都可见)

任何时候视图是不可见的,它都不会绘制它或它的孩子。如果它已经消失,它也不会为它们保留任何布局空间。如果您检查孩子的getVisibility(),您会发现它仍然设置为之前的状态,即使它没有被绘制。

于 2013-11-04T19:31:37.177 回答
0

是的,你在所有方面都是正确的:)

将布局可见性设置为 GONE 将隐藏所有子项。将布局可见性设置为 INVISIBLE 将使所有子级不可见,但仍会被绘制并占用空间。

于 2013-11-04T19:26:50.643 回答
-1

使用以下递归函数使您的子视图可见消失
第一个参数是您的父视图,第二个参数决定您是否希望父视图的子视图可见或消失。 真 = 可见假 = 消失了

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);
    }
}
于 2016-10-11T12:30:01.677 回答