在textview中获取当前可见的文本

我有一个由ScrollView包装的TextView中的长篇大论。 有什么方法可以find当前的可见文本?

我可以在textview中find行数,行高,也可以从scrollview中滚动和滚动,但find当前显示文本的链接。 请帮忙! 谢谢。

Solutions Collecting From Web of "在textview中获取当前可见的文本"

这很简单:

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

你声称你知道scrollY ,当前滚动的像素数目。 你也知道你正在考虑的像素的高度,所以调用scrollViewHeight 。 然后

 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); 

这是一个近似值,所以用它作为最后的手段。

这里。 获取显示的第一行的行号。 然后获取显示的第二行的行号。 然后获取文本并计算单词的数量。

 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; } 

我自己也有同样的问题。 我需要在回收站查看当前可见的第一个可见的行。 如果您正试图在recyclerview中显示第一行textview,则可以使用以下代码:

  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); 

尝试使用getEllipsisStart()

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

使用textView.getLayout()。getEllipsisStart(0)只适用于android:singleLine =“true”

这是一个解决scheme,如果android:maxLines设置将工作:

 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; } 

请记住:这个视图已经加载完成后会有效。

用法:

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