2012-04-02 5 views
11

Ho una domanda riguardante le attività Android. Un'attività ha il metodo addContentView(View) mentre un ViewGroup ha un metodo (simile?) addView(View). Sfortunatamente il suo "dove" non documentato è stato inserito nella vista da addContentView. È come un LinearLayout semplicemente aggiungendo la vista in fondo? È più simile a FrameLayout, che aggiunge le sue viste "onTop"? Dipende dallo ViewGroup impostato da setContentView? Se mi tuffo nelle sorgenti, vedo che addContentView chiamerà il metodo Window astratto addContentView. Sfortunatamente non riesco a vedere quale classe stia implementando questo metodo. Quindi, qual è il comportamento delle attività addContentView esattamente?Activity.addContentView (View) == ViewGroup.addContentView (Visualizza)?

risposta

37

Il layout di base di ogni attività è un FrameLayout. Ciò significa che il layout che si imposta in genere tramite setContentView() è un elemento secondario di questo layout. addContentView() aggiunge solo un altro figlio, quindi si comporta come un FrameLayout(che significa che aggiunge nuovi elementi dell'interfaccia utente sopra quelli esistenti).

È possibile controllare questo utilizzando uno strumento chiamato hierachyviewer dalla cartella ANDROID_SDK\tools. Qui ci sono due screenshots:

enter image description here

Questo è il layout prima di chiamare addContentView(), la mia attività è costituito da quello predefinito FrameLayout, in possesso di un LinearLayout con un pulsante (il mio layout qui). Questo si riflette nella riga inferiore qui, gli altri elementi sopra sono il titolo/barra di stato.

enter image description here

Dopo aver aggiunto un TextView tramite addContentView() sembra che questo. Puoi vedere che il FrameLayout di base ha un nuovo figlio.

+3

Wow. Apprezzo davvero la tua risposta, grazie. il tuo consiglio e lo strumento che hai suggerito mi farà risparmiare un sacco di ore! Sei il tipo di utente che rende Stackoverflow così eccezionale! –

+0

Ottima risposta! Supporto! –

+1

+1 per 'hierachyviewer' – RootCode