2011-12-26 4 views
17

Tôi có một đoạn văn dài trong một TextView được bao quanh bởi ScrollView. Có cách nào để tìm văn bản hiển thị hiện tại không?Nhận văn bản hiển thị hiện tại trong chế độ xem văn bản

Tôi có thể tìm số lượng dòng, chiều cao dòng trong chế độ xem văn bản và cũng có thể cuộn và scrolly từ scrollview, nhưng tìm liên kết đến văn bản được hiển thị hiện tại. Hãy giúp tôi! Cảm ơn.

+0

là một xấp xỉ okay? – Snowball

+0

Xin chào. Tôi đang làm việc trên cùng một vấn đề. Bạn có giải pháp nào cho việc này không. Tôi cần phải tìm ra phần văn bản có thể nhìn thấy từ TextView. Bạn có thể giúp tôi được không? –

+0

Theo như tôi biết, tôi không nghĩ rằng có một cách để làm điều này với TextView. – kosa

Trả lời

1

Bạn tuyên bố rằng bạn biết scrollY, số lượng điểm ảnh hiện tại được cuộn. Bạn cũng biết chiều cao của cửa sổ bạn đang xem xét theo pixel, vì vậy hãy gọi số scrollViewHeight. Sau đó,

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

Đó là một xấp xỉ, vì vậy hãy sử dụng nó như một phương sách cuối cùng.

+0

cảm ơn bạn đã gợi ý của bạn, tôi chỉ cố gắng đó, xấp xỉ là tốt cho đoạn ngắn. Lỗi này là quá nhiều cho văn bản dài mà tôi sẽ hiển thị .... Tôi đang nghĩ đến việc nhận TextPaint để đo văn bản và tính toán nếu không quá tính toán chuyên sâu. – John

14

Nó là đơn giản để làm điều này:

int start = textView.getLayout().getLineStart(0); 
int end = textView.getLayout().getLineEnd(textView.getLineCount() - 1); 

String displayed = textView.getText().toString().substring(start, end); 
+1

Không hoạt động, nhận ngoại lệ con trỏ null – Jayesh

0

thử sử dụng getEllipsisStart()

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

điều này sẽ chỉ hoạt động đối với singleLine = "true" –

2

đây. Nhận số dòng của dòng đầu tiên được hiển thị. Sau đó lấy số dòng của dòng hiển thị thứ hai. Sau đó lấy văn bản và đếm số từ.

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

Tôi cũng có cùng một vấn đề với bản thân mình. Tôi cần dòng hiển thị đầu tiên từ chế độ xem văn bản hiện có thể nhìn thấy trong recyclerview. Nếu bạn đang cố gắng để có được hiển thị hiện dòng đầu tiên của TextView vào recyclerview bạn thể sử dụng đoạn mã sau:.

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

Sử dụng textView.getLayout() getEllipsisStart (0) chỉ hoạt động nếu android: = singleLine "true"

đây là một giải pháp mà sẽ làm việc nếu android: Maxlines được thiết lập:

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

Hãy nhớ rằng: công trình này sau khi xem đã được nạp.

Cách sử dụng:

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