Sto scrivendo un'app con l'unico scopo di cercare di capire come funziona la gerarchia delle viste in Android. Sto avendo alcuni problemi veramente difficili in questo momento. Cercherò di essere conciso nella mia spiegazione qui.Tentativo di comprendere la gerarchia delle viste
Impostazione:
Attualmente ho tre visualizzazioni. 2 sono ViewGroups
e 1 è solo un View
. Diciamo che sono in questo ordine:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
Nel mio Activity
ho semplicemente visualizzare i punti di vista in questo modo:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
Problemi:
Il metodo di Testa
onDraw(Canvas canvas)
non è mai chiamato. Ho visto un paio di soluzioni a questo dicendo che la mia vista non ha alcuna dimensione (altezza/larghezza = 0), tuttavia, questo non è il caso. Quando eseguo l'override dionLayout()
, ottengo le dimensioni del mio layout e sono corrette. Inoltre, getHeight()/Width() sono esattamente come dovrebbero essere. Posso anche eseguire l'override didispatchDraw()
e ottenere le mie visualizzazioni di base da disegnare.Desidero animare un oggetto in
TestB
. Tradizionalmente, sostituivo il metodoonDraw()
alla chiamatainvalidate()
su se stesso fino a quando l'oggetto terminava l'animazione che doveva fare. Tuttavia, inTestB
, quando chiamoinvalidate()
la vista non viene mai ridisegnata. Ho l'impressione che sia compito della mia vista genitore chiamare di nuovo il metodoonDraw()
, ma la mia vista genitore non chiama di nuovo lodispatchDraw()
.
Credo che le mie domande sono, perché sarebbe il mio metodo di mia vista padre onDraw()
non vengono mai chiamati per cominciare? Quali metodi nella mia vista genitore dovrebbero essere chiamati quando uno dei suoi figli si annulla? Il genitore è il responsabile per garantire che i bambini vengano prelevati o che Android si occupi di ciò? Se Android risponde a invalidate()
, perché il mio TestB
non viene mai estratto nuovamente?
puoi condividere questo progetto demo del Viewgroup nel tuo blog o da qualche parte sarà molto utile .. Grazie amico .. – user1201239
devo aggiungere il childView anche se lo specifichiamo in XML? – user1201239
Mi dispiace. Non ho un blog o qualcosa su cui caricare. Cercherò di essere il più utile possibile. Per rispondere alla tua prima domanda, no. Quando si gonfia l'xml, il bambino è contenuto nel 'ViewGroup'. Il primo che puoi recuperare è 'onFinishInflate()'. Dopo di che hai una scelta. Prendi i tuoi figli tramite il metodo 'getChildAt (int index)' o usa 'findViewById (int id)'. L'indice sarà l'ordine in cui i bambini si trovano in xml. Non so come funziona l'indicizzazione con i bambini nei bambini. – DeeV