我认为这与 Set width of TextView 在字符方面相反
我有一个 TextView,我在其中显示一些报告数据。我对其中的一部分使用等宽的 TypefaceSpan,因为我希望列对齐。
我使用我的测试 Android 设备来计算我可以容纳多少列,但 Android 模拟器似乎正好少了一列,这使得在纵向模式下以一种丑陋的方式包装。
有没有办法找出一行应该有多少个字符?
我认为这与 Set width of TextView 在字符方面相反
我有一个 TextView,我在其中显示一些报告数据。我对其中的一部分使用等宽的 TypefaceSpan,因为我希望列对齐。
我使用我的测试 Android 设备来计算我可以容纳多少列,但 Android 模拟器似乎正好少了一列,这使得在纵向模式下以一种丑陋的方式包装。
有没有办法找出一行应该有多少个字符?
答案是使用 textView 的 Paint Object 的 breakText()。这是一个示例,
int totalCharstoFit= textView.getPaint().breakText(fullString, 0, fullString.length(),
true, textView.getWidth(), null);
现在totalCharstoFit
包含可以放入一行的确切字符。现在您可以制作完整字符串的子字符串并将其附加到 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());
}
好吧,你可以做数学来找出这个,找到字符的宽度,将屏幕的宽度除以这个,你就会得到你想要的东西。
但是就不能设计得更好吗?有没有可以组合在一起的列?显示为图形,甚至完全排除?
另一种可能的解决方案是使用类似 viewpager 的东西。(找出有多少列的宽度适合第一页,然后将剩余的表格拆分到第二页)。
您可以通过以下代码获取 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 );
}
}
});
}
试试这种方式。您可以通过这种方式应用多种样式。
您还可以通过以下方式获取 textview 的宽度:
for (int i = 0; i < layout.getLineCount(); i++) {
maxLineWidth = Math.max(maxLineWidth, layout.getLineWidth(i));
}