web-dev-qa-db-ja.com

親ビューの可視性をその子に設定する効果

この質問は、さまざまなビューを動的に表示/非表示にする必要があることから生じます。ビューには、表示、非表示、および非表示の3つの表示設定があります。 LinearLayoutなど、複数の子ビューを持つ親ビューがある場合(それらが何であるかは関係ありません)、親の可視性をすべての子の可視性を個別に設定するのと同じように設定していますか?例えば私が言うなら

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

これは、個々の子ビューを見つけて、それらすべての可視性をView.GONEに設定することと同じですか?親がView.GONEではなくView.INVISIBLEだった場合はどうなりますか?すべての子供たちはまだ描かれていますが、見られていませんか?

19
Rarw

効果は同じですが、実際にはセットすべての子の可視性ではありません。それはそれらを描画しません。

例えば:

  1. 子をGONEに設定します(親が表示され、子が消えます)

  2. 親をGONEに設定します(両方ともなくなりました)

  3. 親をVISIBLEに設定します(子は以前に明示的に設定されていたため、親は表示され、子はまだ消えています)

  4. 子をVISIBLEに設定します(両方とも表示されます)

ビューが非表示の場合は常に、ビューまたはその子を描画しません。なくなった場合は、レイアウトスペースも予約されません。ただし、子のgetVisibility()を確認すると、描画されていなくても、以前の状態に設定されていることがわかります。

33
Geobits

以下の再帰関数を使用して、子ビューをvisibleまたはgoneにします。
最初の引数は親ビューであり、2番目の引数は親ビューの子を表示するか削除するかを決定します。 true =表示false =なくなった

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);
    }
}
0
resw67

ええ、あなたはすべての点で正しいです:)

レイアウトの可視性をGONEに設定すると、すべての子が非表示になります。レイアウトの可視性をINVISIBLEに設定すると、すべての子が非表示になりますが、描画されてスペースを占有します。

0
athor