PROBLEMA: Supponiamo di avere caso semplice: abbiamo vista e dobbiamo mostrare alcuni dati su questo punto di vista. Usiamo il metodo statico showData (View View) per fare questo. Voglio sapere il momento esatto in cui viene misurato il layout della vista e posso accedere a getWidth()getHeight() e verificare che questa sia la larghezza e l'altezza finali della mia vista.addOnLayoutChangeListener vs addOnGlobalLayoutListener vs posta (r Runnable)
quello che so: (non sono sicuro io sono al 100% a destra):
so 3 diversi approcci per fare questo
- view.addOnLayoutChangeListener - sappiamo quando il layout è cambiato , siamo in grado di ottenere altezza e la larghezza
- view.getViewTreeObserver() addOnGlobalLayoutListener -. per il mio caso quasi uguale, ma otteniamo informazioni più tardi. Perché layoutChange bolle da bambini a root e globalLayout da root a child (giusto?).
- view.post (Runnable r) - funziona, ma non so perché runnable è inviato al thread ui viene eseguito dopo aver misurato la vista.
DOMANDA: Qual è l'approccio migliore per sapere che vista si misura? e perché?
grazie :) ma onLayoutChange viene invocato anche dal gruppo di vista padre, quindi perché OnGlobalLayoutListener è una scelta migliore? Mi sto anche interrogando su View.post(). Quindi se ho una chiamata al metodo showData (vista vista) e la prossima linea è view.post (Runnable r) quindi eseguibile sarà eseguito dopo aver misurato la vista e avere un layout preciso? Voglio dire view.post (r) non può accadere tra showData (View v) e onMeasure? – comte1986
quando si chiama View.Gone su un figlio il ViewGroup attiverà onGlobalLayoutListener che potrebbe chiamare onlayoutchange, ovvero quando i limiti cambiano, su globalLayout è lo stato della famiglia, se si modifica la madre viene notificato, quando si utilizza animatore di oggetti per animare la vista verrà attivata, solo un esempio, quindi se vuoi veramente monitorare devi usarlo, e non vengono chiamati spesso, vista.post() come ho detto lo accoda quindi potrebbe esserci il caso che cada sempre dietro le chiamate iniziali definite dall'utente, @ comte1986 spero che aiuti – Elltz