2013-11-04 18 views
16

Questa domanda nasce dal dover mostrare/nascondere le viste in modo dinamico. Le visualizzazioni hanno 3 impostazioni di visibilità: visibili, invisibili e sparite. Se si dispone di una vista genitore, ad esempio uno LinearLayout, che ha diverse visualizzazioni figlio (non importa quali siano) sta impostando la visibilità del genitore allo stesso modo di impostare la visibilità su tutti i bambini in modo indipendente? Per esempio, se io dicoEffetto dell'impostazione della visibilità della vista genitore sui suoi figli

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

è che lo stesso come trovare ogni singola visualizzazione di bambino e impostare tutte quelle visiblities a View.GONE? Cosa succede se il genitore non era View.GONE ma View.INVISIBLE? Tutti i bambini sono ancora disegnati ma non visti?

risposta

30

Il effetto è lo stesso, ma in realtà non impostare la visibilità di tutti i bambini. Semplicemente non li attirerà.

Per esempio:

  1. Set bambino di GONE (genitore è visibile, bambino non c'è più)

  2. Set genitore di GONE (sia andata)

  3. Set genitore a VISIBILE (genitore visibile, figlio ancora scomparso, poiché il bambino era stato impostato in precedenza)

  4. Imposta figlio su VISIBILE (entrambi visibili)

Ogni volta che una vista è INVISIBILE, non la disegna né i suoi figli. Se è GONE, non riserverà alcun spazio di layout per loro. Se controlli il numero getVisibility() del bambino, vedrai che è ancora impostato su qualunque cosa fosse prima, anche se non viene disegnato.

+0

Il comportamento non ha senso per me, soprattutto perché è diverso quando si lavora con l'inflazione XML (ad esempio, la visibilità viene propagata ai bambini). C'è una soluzione alternativa per renderlo coerente tra XML e Java? – milosmns

0

Sì hai ragione su tutti i punti :)

Impostazione della visibilità layout per GONE nasconderà tutti i bambini. Impostare la visibilità dei layout su INVISIBLE renderà tutti i bambini invisibili ma disegnati e occupano ancora spazio.

+0

avete un link a dovunque nella documentazione si dice che? So che quando imposto il layout di un genitore su View.GONE nasconde i bambini, ma li "svita" o li rende invisibili? – Rarw

0

Utilizzare la funzione ricorsiva sotto riportata per rendere visibile la vista del bambino visibile o andato.
Il primo argomento è la vista genitore e il secondo argomento decide se si desidera che i child della vista genitore siano visibili o passati. veri = visibili falsi = andato

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); 
    } 
} 
Problemi correlati