我有多行TextView,我只需要格式化它的单行。由于字体大小和样式是动态的,我需要它来格式化"第一行"自动。
此TextView正在显示一个没有换行的字符串,它会自动换行,我需要格式化第一个换行。
请查看附图:
答案 0 :(得分:0)
试试这个:
myTextView.setText(Html.fromHtml("<b>This is a normal</b><br>second line<br>third line"));
答案 1 :(得分:0)
myTextView.setText(Html.fromHtml("<b>This is a normal</b><br>second line<br>third line"));
但由于您的系统是动态的,因此这不是一个好方法。此代码生成适当的HTML:
String lines[] = string.split("\\n");
String fl = String.format(Locale.ENGLISH, "<b>%s</b><br>", lines[0]);
StringBuilder sb = new StringBuilder();
sb.append(fl);
for(int i = 1; i < lines.length; i++){
sb.append(lines[i] + "<br>");
}
String finalProduct = sb.toString();
然后:
myTextView.setText(Html.fromHtml(finalProduct));
这应该动态创建第一行的HTML标记
<强>说明强>
这是对先前答案的改进。使用HTML,第一行格式为粗体。
使用正则表达式,我们按换行符(\ n)拆分所有行。数组中的第一个String是第一行,而其余的格式并不重要。所以首先我们追加第一行,然后添加其余的行。 for循环从1开始,因为0是第一行。
如果确实动态破坏文本,则将该String传递给上面的方法。我在这里介绍的方法使用那些换行符来确定哪一行在哪里,以便能够将第一行设置为粗体
答案 2 :(得分:0)
我找到了使用StaticLayout的解决方案。
private TextView tvTitle; //bold title with maxLines = 1
private TextView tvText; //the rest of the text
//initialize views, etc...
private void showText(@Nonnull String text) {
tvTitle.setText(text);
tvTitle.post(() -> {
String ellipsizedText = getEllipsizedText(text, tvTitle);
tvText.setText(ellipsizedText);
});
}
private static String getEllipsizedText(String text, TextView textView) {
StaticLayout staticLayout = getStaticLayout(text,
textView.getPaint(),
textView.getWidth(),
1,
null);
return text.substring(staticLayout.getLineEnd(0));
}
private static StaticLayout getStaticLayout(CharSequence text,
TextPaint paint,
int width,
int maxLines,
TextUtils.TruncateAt ellipsize) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return StaticLayout.Builder.obtain(text, 0, text.length(), paint, width)
.setTextDirection(TextDirectionHeuristics.FIRSTSTRONG_LTR)
.setAlignment(Layout.Alignment.ALIGN_NORMAL)
.setLineSpacing(0f, 1f)
.setIncludePad(false)
.setEllipsize(ellipsize)
.setEllipsizedWidth(width)
.setMaxLines(maxLines)
.build();
} else {
return new StaticLayout(text,
paint,
width,
Layout.Alignment.ALIGN_NORMAL,
1f,
0f,
false);
}
}
答案 3 :(得分:-1)
只需使用另一个TextView。 TextView1,TextView2,TextView3。 并将TextView1设置为粗体。