2010-07-30 21 views
5

Tengo una vista de texto que muestra el texto que cambia y ejecuta el tiempo. Quiero utilizar el método View.getLineCount() para ver cuántas líneas ocupa TextView y realizar diferentes funciones en consecuencia. El problema es que necesito determinar el número de líneas que ocupa TextView en el mismo método que necesita saber cuántas líneas ocupa. Intenté llamar a View.invalidate() entre las dos llamadas, pero eso no pareció arreglar nada. Me gustaría medir el número de líneas sin renderizar la vista, si es posible, pero si tuviera que renderizarla estaría dispuesto a hacerlo también. Avíseme si esto no es lo suficientemente específico e intentaré ser más específico. ¡Gracias!Android: Medir el tamaño de la vista antes de representar

Respuesta

1

Esto realmente puede ser un problema realmente complejo en Android. Si necesita saber en el momento en que configura el texto (es decir, antes de que la vista se represente o esté cerca de ser renderizada), su única opción real es usar StaticLayout. Si puede esperar hasta cerca del tiempo de render, se puede utilizar un viewTreeObserver:

yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout(){ 
     yourTextView.getLineCount(); 
    } 
} 

onGlobalLayout puede ser llamado varias veces y, a veces (por cualquier razón) he encontrado que las opiniones no están realmente dispuestas todavía, por lo deberías hacer un poco de registro y ver si puedes encontrar la manera de asegurarte de que el resultado que obtengas realmente tenga sentido (es decir, un conteo de líneas> 0).

StaticLayouts es una alternativa más complicada que debería poder darle el tamaño de su vista y número de líneas. Pueden requerir algunos ajustes para conseguir que funcione correctamente, y asegúrese de usar la pintura desde el punto de vista que estamos tratando de medir:

yourTextView.setText(newText); 
//the last boolean should be true if you're using padding on your view 
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(), 
    maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false) 

int numberOfLines = measure.getLineCount(); 

Si usted está dispuesto a (o ya tiene) una subclase de Vista de Texto, se puede anular onSizeChanged o onMeasure e intentar obtener el número de líneas allí. De nuevo, al igual que con el observador de árbol de vista, a veces se pueden invocar antes de que se haya medido realmente su vista, por lo que es posible que tenga que verificar para asegurarse de que el valor que obtenga en esos métodos tenga sentido.

Cuestiones relacionadas