Obtener texto visible actual en textview

Tengo un pasaje largo en un TextView que está envuelto por ScrollView. ¿Hay alguna forma de encontrar el texto visible actual?

Puedo encontrar el número de líneas, el alto de la línea en la vista de texto y también scrollx y scrolly desde la vista de desplazamiento, pero encuentro el vínculo con el texto que se muestra actualmente. ¡Por favor ayuda! Gracias.

Es simple hacer esto:

int start = textView.getLayout().getLineStart(0); int end = textView.getLayout().getLineEnd(textView.getLineCount() - 1); String displayed = textView.getText().toString().substring(start, end); 

Aquí. Obtenga el número de línea de la primera línea mostrada. Luego, obtenga el número de línea de la segunda línea mostrada. Luego, obtenga el texto y cuente la cantidad de palabras.

 private int getNumberOfWordsDisplayed() { int start = textView.getLayout().getLineStart(getFirstLineIndex()); int end = textView.getLayout().getLineEnd(getLastLineIndex()); return textView.getText().toString().substring(start, end).split(" ").length; } /** * Gets the first line that is visible on the screen. * * @return */ public int getFirstLineIndex() { int scrollY = scrollView.getScrollY(); Layout layout = textView.getLayout(); if (layout != null) { return layout.getLineForVertical(scrollY); } Log.d(TAG, "Layout is null: "); return -1; } /** * Gets the last visible line number on the screen. * @return last line that is visible on the screen. */ public int getLastLineIndex() { int height = scrollView.getHeight(); int scrollY = scrollView.getScrollY(); Layout layout = textView.getLayout(); if (layout != null) { return layout.getLineForVertical(scrollY + height); } return -1; } 

Usted afirma que conoce scrollY , la cantidad actual de píxeles desplazados. También conoce la altura de la ventana que está considerando en píxeles, así que llame a scrollViewHeight . Entonces

 int scrollY; // This is your current scroll position in pixels. int scrollViewHeight; // This is the height of your scrolling window. TextView textView; // This is the TextView we're considering. String text = (String) textView.getText(); int charsPerLine = text.length() / textView.getLineCount(); int lineHeight = textView.getLineHeight(); int startLine = scrollY / lineHeight; int endLine = startLine + scrollViewHeight/lineHeight + 1; int startChar = charsPerLine * startLine; int endChar = charsPerLine * (endLine+1) + 1; String approxVisibleString = text.substring(startChar, endChar); 

Es una aproximación, así que úsala como último recurso.

También tengo sobre el mismo problema yo mismo. Necesitaba la primera línea visible de la vista de texto actualmente visible en recyclerview. Si está tratando de obtener actualmente la primera línea de vista de texto en recyclerview, puede usar el siguiente código:

  TextView tv = (TextView) recyclerView.getChildAt(0); //gets current visible child view // this is for top visible //view or the textview directly Rect r1 = new Rect(); tv.getHitRect(r1);//gets visible rect of textview Layout l = tv.getLayout(); int line = l.getLineForVertical(-1 * r1.top);//first visible line int start = l.getLineStart(line);//visible line start int end = l.getLineEnd(line);//visible line end String displayed = tv.getText().toString().substring(start, end); 

prueba usar getEllipsisStart ()

 int end = textView.getLayout().getEllipsisStart(0); 

Usar textView.getLayout (). GetEllipsisStart (0) solo funciona si android: singleLine = “true”

Aquí hay una solución que funcionará si android: maxLines está configurado:

 public static String getVisibleText(TextView textView) { // test that we have a textview and it has text if (textView==null || TextUtils.isEmpty(textView.getText())) return null; Layout l = textView.getLayout(); if (l!=null) { // find the last visible position int end = l.getLineEnd(textView.getMaxLines()-1); // get only the text after that position return textView.getText().toString().substring(0,end); } return null; } 

Recuerde: esto funciona después de que la vista ya está cargada.

Uso:

 textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { textView.getViewTreeObserver().removeOnGlobalLayoutListener(this); Log.i("test" ,"VisibleText="+getVisibleText(textView)); } }); 

Esto depende del uso de Ellipsize en TextView. Prueba esto:

 public String getVisibleText(TextView tv) { int lastLine = tv.getMaxLines() < 1 || tv.getMaxLines() > tv.getLineCount() ? tv.getLineCount() : tv.getMaxLines(); if (tv.getEllipsize() != null && tv.getEllipsize().equals(TextUtils.TruncateAt.END)) { int ellCount = tv.getLayout().getEllipsisCount(lastLine - 1); if (ellCount > 0 && tv.length() > ellCount) return tv.getText().toString().substring(0, tv_title.getText().length() - ellCount); return tv.getText().toString(); } else { int end = tv.getLayout().getLineEnd(lastLine - 1); return tv.getText().toString().substring(0, end); } } 

 textView.post(new Runnable() { @Override public void run() { Log.d(TAG, getVisibleText(textView)); } });