2012-08-14 8 views
42

Sto compilando un layout lineare in modo dinamico. A seconda della risposta, devo cancellare le precedenti visualizzazioni secondarie e creare nuove visualizzazioni. Ho letto il documento, ma sono ancora confuso con i metodi di coppia, hanno tutti la stessa funzione. Quale funzione dovrei usare.Qual è la differenza tra removeAllViews() e removeAllViewsInLayout()

+0

stessa domanda qui. Aggiungo una linearlayout in un getview ad un altro linearlayout. Usando RemoveAllViewsInLayout() invece di RemoveAllViews() ho risolto un problema con me dove la linearlayout aggiunta era improvvisamente scomparsa (e dopo lo scorrimento tornava 0_o) – Boy

risposta

18

removeAllViews(): -Chiama questo metodo per rimuovere tutte le viste figlio dal ViewGroup. removeAllViewsInLayout(): -Collocato da una sottoclasse ViewGroup per rimuovere le viste secondarie da se stesso, quando deve prima conoscere le sue dimensioni sullo schermo prima di poter calcolare quante visualizzazioni figlio renderanno.

Cheers!

+5

Questa è una versione allegra di quello che dicono i documenti, che è chiaro come il fango. Non è la Vista stessa (come LinearLayout) una sottoclasse di ViewGroup che rimuove le viste di childs da se stesso? E come facciamo a sapere se la vista deve prima conoscere le sue dimensioni sullo schermo prima di poter calcolare quante visualizzazioni figlio renderà? –

8

Beh, guardando il sorgente, non c'è molta differenza:

public void removeAllViews() { 
    removeAllViewsInLayout(); // Details implemented here 
    requestLayout(); 
    invalidate(true); 
} 

Quindi, a meno che si desidera chiamare invalidate() in un momento di vostra scelta, si potrebbe anche usare removeAllViews() e risparmiare un po ' di battitura.

MODIFICA
Per una spiegazione più dettagliata, vedere la risposta di David Lui. Per riassumere, utilizza removeAllViews() a meno che non sia in corso la costruzione di una vista, nel qual caso chiamerai removeAllViewsInLayout().

12

Come sottolinea Scott Biggs, la differenza non è grande. L'unica differenza è che removeAllViews() chiama requestLayout() e invalidate() in seguito. La chiave del perché questa differenza è qui è capire la denominazione di removeAllViewInLayout(). In modo confuso, il suo significato non è "rimuovere tutte le viste all'interno di questo layout di visualizzazione".

If we look at the similar method, removeViewInLayout(), we can understand what it's supposed to mean:

rimuove una vista durante il layout. Questo è utile se nel tuo metodo onLayout(), è necessario rimuovere più visualizzazioni.

Così removeAllViewsInLayout() in realtà significa "rimuovere tutti i punti di vista, e stiamo chiamando questo metodo durante un passaggio di layout (cioè onLayout())". Ecco perché removeAllViewsInLayout() non chiama fino a requestLayout(), poiché si presume che tu sia già al momento all'interno di un passaggio di layout, quindi la richiesta di un altro passaggio di layout non è necessaria.

Se si utilizza removeAllViewsInLayout(), è responsabilità dell'utente assicurarsi di chiamarlo durante un passaggio di layout o di chiamare correttamente requestLayout() e invalidate() secondo necessità.

+0

Wow, grazie per la spiegazione profonda! Forse avrebbero dovuto chiamarlo, 'removeAllViewsDuringLayoutConstruction()' per evitare l'uso ambiguo della preposizione, _in_. E forse un po 'di documentazione avrebbe aiutato. Nahh, i documenti completi darebbero un attacco di cuore ai programmatori. :) –

Problemi correlati