2012-05-08 7 views
8

안드로이드 앱의 여러 페이지에 완전한 텍스트 문서를 표시하려고합니다. 각 페이지에는 텍스트를 표시하는 TextView 컨트롤이 있습니다. 또한 텍스트 뷰를 업데이트하고 마지막으로 표시된 섹션에서 텍스트가 끝난 곳의 텍스트를 따르는 담당 버튼이 있습니다.
문제는 어떻게 TextView의 표시 가능 영역에 마지막으로 표시된 단어를 찾을 수 있습니까?
참고 :이 응용 프로그램에서 textview 이 스크롤되거나 줄임표를 사용하지 않아야합니다. 텍스트 크기를 늘리거나 줄일 수도 있습니다. 샘플 텍스트 표시 할 : 상황보다가 이해하기 이것은 전체 텍스트입니다마지막 단어가 텍스트보기에 표시됩니다.

. 첫 페이지에서 여기로 끝났으며 여기에서 이어야합니다.

그리고 이것은 이것의 표시 예입니다. 문제는 페이지 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

텍스트가 항상 동일하거나 변경 될 수 있습니까? – caiocpricci2

+0

텍스트가 동적으로 변경됩니다. – VSB

답변

1

마지막으로 표시된 단어를 찾을 수있는 코드 조각을 개발했습니다. 우리는 텍스트의 크기 (DP)의 크기와 TEXTSIZE폭 속성높이와 텍스트 뷰를 사용하려고하는 점을 감안하면이 기능 formatStringToFitInTextView는 텍스트 뷰의 마지막 표시 단어를 평가하고 함수에 반환 산출. 아래 샘플에서 SERIF 글꼴을 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; 
} 

작업을 수행하는 총 논리는 단어로 입력 텍스트를 분할하고 제공된 높이와 너비를 채우고 다음으로 마지막으로 마지막으로 추가 된 단어를 반환 단어를 표시까지 텍스트 뷰 하나가 단어 하나를 추가한다.

참고 : Moritz 덕분에 기능 측정을 this answer에서 사용했습니다.

1

지금은이 아이디어를 시도 할 수 없지만 한번 시도해 보겠습니다. this post에 따르면 다음 방법을 사용하여 문자열이 텍스트보기에 맞는지 확인할 수 있습니다.

private boolean isTooLarge (TextView text, String newText) { 
    float textWidth = text.getPaint().measureText(newText); 
    return (textWidth >= text.getMeasuredWidth()); 
} 

그래서 하나 개의 아이디어, 텍스트가 항상 같은 경우, 수동으로 각 텍스트 뷰에 대한 초기 값을 정의하고 증가 또는 글꼴을 줄일 때 다음 제거하거나 단어를 추가, 그것을 다시 계산.

는 초기 값이 수동으로 뭔가를 할 수있는 입력 옵션이 아닌 경우 :

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

당신은 텍스트 크기를 조정할 때 또한 그래서, 텍스트 뷰의 첫 번째 단어의 위치를 ​​저장해야합니다 당신은 어디서부터 시작 해야할지 압니다!

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

그리고 크기를 조정할 때 동일한 방법으로 화면의 텍스트를 계산합니다. 당신이 더 빠르게하고 싶다면

lastUsedWord = firstWordOnTextView; 

, 당신은, 당신은 각 페이지에 얼마나 많은 단어를 추적 평균을 몇 실행 후 항상 거기에서 루프를에 시작할 수 있습니다. 또는 반복하기 전에 피하기 위해 몇 마디.

한 번에 너무 많은 페이지를 표시 할 필요가없는 경우 합리적인 해결책이라고 생각합니다.

코드에서 실수를해서 죄송합니다. 지금 사용해 보지 않아도됩니다! 이 솔루션에 대한 의견? 매우 흥미로운 질문입니다!

+0

답변 해 주셔서 감사합니다. 당신의 대답은 흥미롭고 유용합니다. 그러나 수직 줄 간격을 고려해야하기 때문에 여러 줄 TextView에는 적합하지 않습니다. 그리고 마지막으로 수직 간격의 추정치를 검색하여 다음과 같이 사용 된 솔루션을 찾았습니다 : [This Post] (http://stackoverflow.com/questions/7549182/android-paint-measuretext-vs-gettextbounds). 여기서 끝낼 때 코드를 게시 할 것입니다. 귀하의 메모 주셔서 감사합니다 :) – VSB

+0

오, 내 나쁜, 나는 그걸 알아 차리지 못했습니다! 그럼 우리와 공유 할 수 있습니다 :) – caiocpricci2

+0

당신은 지금 대답 할 수 있습니다 :) – VSB

관련 문제