在Android中格式化多行TextView的第一行

时间:2017-05-14 07:53:49

标签: android textview format render

我有多行TextView,我只需要格式化它的单行。由于字体大小和样式是动态的,我需要它来格式化"第一行"自动。

此TextView正在显示一个没有换行的字符串,它会自动换行,我需要格式化第一个换行。

请查看附图:

enter image description here

4 个答案:

答案 0 :(得分:0)

试试这个:

myTextView.setText(Html.fromHtml("<b>This is a normal</b><br>second line<br>third line"));

答案 1 :(得分:0)

来自@ HiteshGehlot的答案:

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设置为粗体。