2015-05-31 15 views
7

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é?

risposta

1

Qual è l'approccio migliore per sapere che la vista viene misurata?

Il miglior approccio? OnGlobalLayoutListener con View.getMeasuredHeight() o View.getMeasuredWidth()

e perché?

Perché la tua mamma ti conosce meglio di quanto tu conosca te stesso, per cui il suo meglio consultare il ViewGroup sul suo stato in cui si parla automaticamente i volumi sui bambini.

View.post() processo di accodamenti nella coda ui. Coda Ui = {1,2}, più tardi dopo aver chiamato quella riga = {1,2, eseguibile}. quindi sicuramente verrà eseguito dopo 1,2

+0

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

+0

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