8

Androidアプリのいくつかのページに完全なテキストドキュメントを表示します。各ページには、テキストの表示を担当するTextViewコントロールが含まれています。また、テキストビューを更新し、最後に表示されたセクションで終了した場所からテキストを追跡するための次のボタンも含まれています。
問題は、TextViewの表示可能領域で最後に表示された単語をどのように見つけることができるかです。
注:このアプリでは、textViewをスクロールしたり、ellipsizeを使用したりすることは想定されていません。また、textsizeは増減できることに注意する必要があります。状況をよりよく理解するために:表示されるサンプルテキスト:

これは全文です。最初のページそれはここで終わったばかり、ここから続く必要があります。

そして、これはそのディスプレイのサンプルイラストです。問題は、1ページに表示されている最後の単語として「ここ」という単語を見つける方法です。 そして、これはそのディスプレイのサンプルイラストです。 問題は、単語を見つける方法です

4

2 に答える 2

1

今はこのアイデアを試すことはできませんが、試してみましょう。この投稿によると、次の方法を使用して、文字列がテキストビューに収まるかどうかを確認できます。

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

また、textViewの最初の単語の位置を保存する必要があるため、テキストのサイズを変更すると、どこから始めればよいかがわかります。

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

また、サイズを変更するときは、同じ方法で画面上のテキストを計算するために使用します。

lastUsedWord = firstWordOnTextView;

さらに速くしたい場合は、各ページにある単語の数を追跡し、平均を作成し、数回実行した後は常にそこからループを統計することができます。または、前に数回繰り返す必要がないようにします。

一度に多くのページを表示する必要がない場合、これは合理的な解決策だと思います。

コードの間違いで申し訳ありませんが、今はどこで試すことができません!このソリューションについて何かコメントはありますか?非常に興味深い質問です!

于 2012-05-09T22:08:04.040 に答える
1

最後に、最後に表示された単語を見つけることができるコードを開発しました。サイズとしてwidthheightのプロパティを持ち、テキストのサイズとして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;
}

アクションを実行するための全体的なロジックは、入力テキストを単語に分割し、指定された高さと幅がいっぱいになるまで単語を1つずつtextviewに追加し、最後に追加された単語を最後に表示された単語として返します。

注:Moritzのお​​かげで、この回答の関数測度を使用しました。

于 2012-05-12T13:18:06.563 に答える