これは、文字に関してTextViewの幅を設定するのとは逆だと思います
いくつかのレポートデータを表示しているTextViewがあります。列を並べたいので、その一部にモノスペースTypefaceSpanを使用します。
テスト用のAndroidデバイスを使用して、収まる列の数を計算しましたが、Androidエミュレーターの列は1つ少ないようで、ポートレートモードでは見苦しい方法で折り返されます。
1行に何文字収まるかを知る方法はありますか?
これは、文字に関してTextViewの幅を設定するのとは逆だと思います
いくつかのレポートデータを表示しているTextViewがあります。列を並べたいので、その一部にモノスペースTypefaceSpanを使用します。
テスト用のAndroidデバイスを使用して、収まる列の数を計算しましたが、Androidエミュレーターの列は1つ少ないようで、ポートレートモードでは見苦しい方法で折り返されます。
1行に何文字収まるかを知る方法はありますか?
答えは、textViewのペイントオブジェクトのbreakText()を使用することです。これがサンプルです、
int totalCharstoFit= textView.getPaint().breakText(fullString, 0, fullString.length(),
true, textView.getWidth(), null);
totalCharstoFit
これで、1行に収まる正確な文字が含まれます。これで、完全な文字列のサブ文字列を作成して、次のようにTextViewに追加できます。
String subString=fullString.substring(0,totalCharstoFit);
textView.append(substring);
そして、残りの文字列を計算するには、これを行うことができます、
fullString=fullString.substring(subString.length(),fullString.length());
今、完全なコード、
これをwhileループで実行します。
while(fullstirng.length>0)
{
int totalCharstoFit= textView.getPaint().breakText(fullString, 0, fullString.length(),
true, textView.getWidth(), null);
String subString=fullString.substring(0,totalCharstoFit);
textView.append(substring);
fullString=fullString.substring(subString.length(),fullString.length());
}
さて、これを見つけるために数学を行うことができ、文字の幅を見つけ、これで画面の幅を割ると、あなたはあなたが探しているものを手に入れるでしょう。
しかし、それをより良く設計することは不可能ですか?グループ化できる列はありますか?グラフィックとして表示しますか、それとも完全に除外しますか?
別の可能な解決策は、ビューページャーのようなものを使用することです。(最初のページに収まる列の幅を調べてから、残りのテーブルを2番目のページに分割します)。
以下のコードでTextviewの全行と各文字の文字列を取得できます。その後、各行にスタイルを設定できます。
最初の行を太字にしました。
private void setLayoutListner( final TextView textView ) {
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
final Layout layout = textView.getLayout();
// Loop over all the lines and do whatever you need with
// the width of the line
for (int i = 0; i < layout.getLineCount(); i++) {
int end = layout.getLineEnd(0);
SpannableString content = new SpannableString( textView.getText().toString() );
content.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, end, 0);
content.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), end, content.length(), 0);
textView.setText( content );
}
}
});
}
この方法を試してください。この方法で複数のスタイルを適用できます。
テキストビューの幅は、次の方法で取得することもできます。
for (int i = 0; i < layout.getLineCount(); i++) {
maxLineWidth = Math.max(maxLineWidth, layout.getLineWidth(i));
}