android - uso - si tengo miopia debo usar lentes todo el tiempo
Lo que hace que se llame a una medida de Vista() (2)
Bueno, si está cambiando el contenido de una vista, eventualmente tendrá que llamar a invalidate (). Por ejemplo, tiene una vista de texto con un texto llamado "Texto 1". Ahora, cambia el texto del mismo TextView a "Texto 2". Aquí también, se llamará a invalidar.
Entonces, básicamente, cuando algo cambia en la vista, la mayoría de las veces, se esperaría que se llamara al método invalida y una llamada correspondiente a la medida ().
Mire el código fuente de TextView, por ejemplo. http://www.google.com/codesearch#uX1GffpyOZk/core/java/android/widget/TextView.java&q=TextView%20package:android&type=cs
Cuenta el número de llamadas invalidadas. Hay unos cuantos.
En mi aplicación, tengo un bucle infinito en una de las anulaciones de onMeasure () de View. Depurando el código fuente comenzando desde un punto de interrupción en my onMeasure, puedo rastrear todo el camino hasta la vista de seguimiento de pila de PhoneWindow $ DecorView () (la clase más alta en mi jerarquía de vista), que recibe el nombre de ViewRoot .performTraversals (). Ahora, desde aquí, si sigo dando un paso al frente, eventualmente obtengo que el measure ($) de $ DecorView de PhoneWindow sea llamado nuevamente por un mensaje en la clase Looper.loop (). Supongo que algo ha puesto en cola un mensaje que necesita volver a medir, como invalidar.
Mi pregunta es, ¿qué desencadena que una llamada de medición deba ocurrir en una vista?
Desde mi comprensión del proceso de disposición / medida / dibujar, esto solo ocurrirá cuando se invoque el método invalidate () en una vista específica, y eso se filtrará y se realizará una pasada de diseño / medida / dibujar invalidada para esa vista y todos sus hijos. Asumo que de alguna manera mi vista más alta en mi jerarquía de vista está siendo invalidada.
Sin embargo, he puesto explícitamente un punto de interrupción en cada una de las llamadas invalidadas que tengo, y no estoy invocando de forma infinita. Entonces, no creo que ese sea el caso. ¿Hay alguna otra manera de activar un pase de medida? ¿Podría algo internamente desencadenar esto? Estoy un poco sin ideas después de ver que nada es infinito invalidante.
Para activar un pase de medida para una vista personalizada, debe llamar al método requestLayout (). Por ejemplo, si está implementando una vista personalizada que extiende View y se comportará como un TextView, podría escribir un método setText como este:
/**
* Sets the string value of the view.
* @param text the string to write
*/
public void setText(String text) {
this.text = text;
//calculates the new text width
textWidth = mTextPaint.measureText(text);
//force re-calculating the layout dimension and the redraw of the view
requestLayout();
invalidate();
}