Ho una vista che visualizza testi e immagini in colonne, in una finestra che scorre orizzontalmente. Riflette e quindi (almeno potenzialmente) si ridimensiona quando il suo contenuto cambia; inoltre, scorre e ridimensiona (mantenendo un'area approssimativamente costante) quando la tastiera virtuale viene e viene e l'altezza della vista cambia.requestLayout() non ha alcun effetto quando viene chiamato da onSizeChanged()?
Quello che ho trovato è che chiamando requestLayout() opere (nel senso che esso non innescare una chiamata al mio onMeasure() sovraccarico) la maggior parte del tempo ... ma non quando viene chiamato dal mio onSizeChanged() gestore.
sono stato in grado di ovviare a questo post() ing un Runnable che ha chiamato requestLayout()
e poi post()
Ed un'altra Runnable
che ha chiamato il mio codice che deve essere eseguito dopo il onMeasure()
... ma questo sembra un po 'fragile (non lo faccio voglio aggiungere un ritardo, ma voglio essere sicuro che il mio secondo Runnable
si esegua dopo l'asincrono onMeasure()
e, forse perché fa tanti passaggi attraverso il ciclo degli eventi, lo schermo lampeggia troppo.
C'è qualche modo - in un onSizeChanged()
- per forzare un onMeasure()
(e, probabilmente, un altro onSizeChanged()
) avvenga prima del prossimo onDraw()?
Invece di chiamare 'requestLayout()' una seconda volta (e non funziona da 'onSizeChanged()', perché questo callback è parte del processo di layout) perché non è sufficiente calcolare la dimensione corretta in 'onMeasure()'? –
Sì, e funziona. Ma quando l'altezza cambia, riflusso - che cambia la larghezza - e quindi devo attivare una chiamata a 'onMeasure()'. –
La tua domanda mi ha effettivamente dato una risposta per un problema che ho avuto, grazie :) La tua soluzione View.post funziona senza effetti collaterali per me. Grazie! –