2009-12-22 23 views
10

Tengo una vista de texto dentro de una vista de desplazamiento. Digamos que ScrollView se llama s y TextView se llama t.Desplazamiento de una vista de texto a una línea específica

Tengo muchas líneas para mostrar en el TextView y, al mismo tiempo, quiero desplazar la vista a una línea específica.

Así que hice esto:

t.setText(aVeryLongString); 
int y = t.getLayout().getLineTop(40); // e.g. I want to scroll to line 40 
s.scrollTo(0, y); 

pero no va a desplazarse, a excepción la segunda vez. Parece que la primera vez que el código finaliza, ScrollView sabe cuánto es la altura total de TextView.

Así que creo que debe haber algo para forzar el cálculo de la altura necesaria antes del scrollTo call. ¿Cómo hacer eso (o no)?

+0

¿Está ejecutando el código en el hilo de la interfaz de usuario? – Tughi

+0

Es el código en onReceiveResult (llamado otra actividad, la actividad pone algunos datos y termina(), y recibe los datos). No entiendo lo suficiente sobre el modelo de threading en Android. – yuku

Respuesta

20

Encontrado la respuesta here.

En lugar de llamar directamente al scrollTo, debemos llamar al post en su lugar en el ScrollView. Esto funciona.

t.setText(aVeryLongString); 
s.post(new Runnable() { 
    @Override 
    public void run() { 
     int y = t.getLayout().getLineTop(40); // e.g. I want to scroll to line 40 
     s.scrollTo(0, y); 
    } 
}); 
+0

Casi 2 años después ... Pensé que esto era lo mismo que publicar el código en un controlador. Resulta que debe publicarlo en la vista de desplazamiento en lugar de hacerlo en el controlador. (el código anterior es correcto) – yuku

Cuestiones relacionadas