2010-02-10 6 views
20

J'ai un TextView plein écran qui contient un long Spanned qui nécessite un défilement. Le getLineCount() de TextView me donne le nombre total de lignes utilisées pour le bloc de texte entier mais j'aimerais savoir combien de lignes de texte sont actuellement visibles à l'écran.Existe-t-il un moyen de récupérer le nombre de lignes visibles ou la plage d'un TextView?

Ou, mieux encore, existe-t-il un moyen de déterminer la gamme de lignes actuellement visibles à l'écran? Par exemple, comme la vue défile, puis-je savoir que les lignes 20-60 sont actuellement visibles?

Répondre

29

je me suis dit la réponse:

int height = myTextView.getHeight(); 
int scrollY = myTextView.getScrollY(); 
Layout layout = myTextView.getLayout(); 

int firstVisibleLineNumber = layout.getLineForVertical(scrollY); 
int lastVisibleLineNumber = layout.getLineForVertical(scrollY+height); 
+2

'getLayout()' renvoie la valeur null –

+1

@MrSuS il renvoie null si vous voulez le récupérer avant que View ait été mis en page. –

+2

J'ai essayé d'utiliser le code mentionné ci-dessus mais il renvoie un mauvais nombre de lignes lors de l'utilisation en orientation paysage. De plus, quelques lignes partielles sont visibles. – user2538359

4

Pour faire travailler, vous devez écrire le code affiché par @ Robert de cette façon:

ViewTreeObserver vto = txtViewEx.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       ViewTreeObserver obs = txtViewEx.getViewTreeObserver(); 
       obs.removeOnGlobalLayoutListener(this); 
       height = txtViewEx.getHeight(); 
       scrollY = txtViewEx.getScrollY(); 
       Layout layout = txtViewEx.getLayout(); 

       firstVisibleLineNumber = layout.getLineForVertical(scrollY); 
       lastVisibleLineNumber = layout.getLineForVertical(height+scrollY); 

      } 
     }); 
Questions connexes