2012-05-08 24 views
8

Tôi sẽ hiển thị một tài liệu văn bản hoàn chỉnh trên một số trang trong một ứng dụng Android. Mỗi trang chứa một điều khiển TextView phụ trách để hiển thị văn bản. Nó cũng chứa một nút tiếp theo, phụ trách để cập nhật văn bản và theo dõi văn bản ngay từ khi nó kết thúc trong phần được hiển thị cuối cùng.
Vấn đề là làm thế nào tôi có thể tìm thấy từ được hiển thị cuối cùng trong vùng hiển thị của TextView?
Lưu ý: Trong ứng dụng này, textView không phải là nghĩa vụ phải được cuộn hoặc sử dụng dấu ba chấm. Nó cũng phải được lưu ý văn bản có thể được tăng hoặc giảm. Để hiểu tình hình tốt hơn: Sample Text để được hiển thị:từ cuối cùng được hiển thị trong một lần xem văn bản

Đây là toàn bộ văn bản. Ở trang đầu tiên Nó vừa kết thúc tại đây và phải là được theo dõi từ đây.

Và đây là minh họa mẫu của màn hình. Câu hỏi đặt ra là làm thế nào để tìm từ "ở đây" như từ cuối được hiển thị trong trang 1? And this is the sample illustration of the its display. The question is how to find word "here" as last word displayed in page 1?

+0

Văn bản sẽ luôn giống hoặc có thể thay đổi? – caiocpricci2

+0

văn bản sẽ được thay đổi động. – VSB

Trả lời

1

Cuối cùng tôi đã phát triển đoạn mã có thể tìm thấy từ được hiển thị cuối cùng. Xét rằng chúng ta sẽ sử dụng một cái nhìn văn bản với các tính chất rộngchiều cao như kích thước và nó textSize trong dp như kích thước của văn bản, chức năng formatStringToFitInTextView đánh giá từ hiển thị cuối cùng trong TextView và trả nó về như chức năng đầu ra. Trong mẫu dưới đây, chúng tôi coi font SERIF là kiểu chữ TextView.

String formatStringToFitInTextView(int width, int heigth, String inputText,float textSize) { 
    String[] words; 
    String lastWord = ""; 
    String finalString=""; 
    StaticLayout stLayout; 
    int i,numberOfWords; 
    int h; 
    Typeface tf = Typeface.SERIF; 
    TextPaint tp = new TextPaint(); 
    tp.setTypeface(tf); 
    tp.setTextSize(textSize); //COMPLEX_UNIT_DP 

    words = inputText.split(" "); //split input text to words 
    numberOfWords = words.length; 
    for (i=0;i<numberOfWords;i++){ 
     stLayout= measure(tp,finalString+words[i]+" ",width); 
     h=stLayout.getHeight(); 
     if (stLayout.getHeight() > heigth) break; 
     finalString += words[i]+" "; 
     lastWord = words[i]; 
    } 

    return lastWord; 
} 
StaticLayout measure(TextPaint textPaint, String text, Integer wrapWidth) { 
    int boundedWidth = Integer.MAX_VALUE; 
    if(wrapWidth != null && wrapWidth > 0) { 
     boundedWidth = wrapWidth; 
    } 
    StaticLayout layout = new StaticLayout(text, textPaint, boundedWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 
    return layout; 
} 

Tổng logic để làm những hành động được chia văn bản đầu vào từ và thêm từ từng người một để TextView cho đến khi nó đầy lên chiều cao và chiều rộng được cung cấp và sau đó trở về từ được thêm vào cuối cùng là cuối cùng hiển thị văn bản.

Lưu ý: Nhờ Moritz, tôi đã sử dụng biện pháp chức năng từ this answer.

1

Tôi không thể thử ý tưởng này ngay bây giờ nhưng hãy thử xem! Theo this post, bạn có thể sử dụng phương pháp sau đây để tìm hiểu xem chuỗi có phù hợp với một lần xem văn bản hay không. Vì vậy, một ý tưởng, nếu văn bản luôn giống nhau, bạn có thể xác định các giá trị ban đầu cho mỗi chế độ xem văn bản theo cách thủ công và sau đó khi bạn tăng hoặc giảm phông chữ bạn tính toán lại, xóa hoặc thêm từ.

Nếu nó không phải là một lựa chọn để nhập các giá trị ban đầu bằng tay bạn có thể làm một cái gì đó như:

String wordsInTextview = new String(); 
int lastUsedWord= 0; 
int totalNumberOfWords = text.size(); 
    for (int i=lastUsedWord;i<totalNumberOfWords;i++) {    
     if !(isTooLarge(TextView,wordsInTextview)) { 
      wordsInTextview = wordsInTextview + text(i); // add the words to be shown 
     } else { 
     TextView.setText(wordsInTextView); 
     lastUsedWord= i; 
     wordsInTextView = new String(); // no idea if this will erase the textView but shouldn't be hard to fix  
     }  
    } 

Bạn cũng sẽ cần phải lưu trữ vị trí của từ đầu tiên của TextView, vì vậy khi bạn thay đổi kích thước văn bản bạn biết bắt đầu từ đâu!

int firstWordOnTextView = TextView.getText().toString().split(" ")[0] 

Và khi đổi kích thước, bạn sử dụng cùng phương pháp để tính toán văn bản trên màn hình.

lastUsedWord = firstWordOnTextView; 

Nếu bạn muốn nhanh hơn, bạn có thể theo dõi số từ bạn có trên mỗi trang, tạo trung bình và sau một vài lần chạy luôn là vòng lặp của bạn từ đó. Hoặc một vài từ trước để tránh phải lặp lại.

Tôi tin rằng đây là giải pháp hợp lý nếu bạn không phải hiển thị quá nhiều trang cùng một lúc!

Xin lỗi vì lỗi trong mã Tôi không có nơi để dùng thử ngay bây giờ! Bất kỳ ý kiến ​​về giải pháp này? Câu hỏi rất thú vị!

+0

Cảm ơn câu trả lời của bạn. Câu trả lời của bạn cũng thú vị và hữu ích. Tuy nhiên, nó không phù hợp với TextView nhiều dòng vì bạn nên tính đến khoảng cách dọc. Và tìm kiếm ước tính khoảng cách dọc cuối cùng tôi đến các giải pháp được sử dụng trong: [Bài đăng này] (http://stackoverflow.com/questions/7549182/android-paint-measuretext-vs-gettextbounds). Tôi sẽ đăng mã của tôi khi hoàn thành ở đây. cảm ơn cho lưu ý của bạn :) – VSB

+0

Oh, xấu của tôi, tôi đã không nhận thấy điều đó! Vâng, hãy chia sẻ nó với chúng tôi :) – caiocpricci2

+0

bạn có thể có câu trả lời ngay bây giờ :) – VSB

Các vấn đề liên quan