不改变其他属性的情况下从TextView中移除粗体属性

9
我使用 setTypeface 将文本设置为 加粗(或斜体,或其他 字形属性)。
TextView tv = findViewById(R.id.label);
...
tv.setTypeface(null,Typeface.BOLD);
...

如何仅删除加粗属性,而不更改已设置的其他属性?

4个回答

22
tv.setTypeface(null,Typeface.NORMAL);

这将使样式恢复正常,而不更改颜色或大小。

但您不能以此方式混合粗体/斜体/下划线文本。如果指定BOLD(粗体),则所有文本都将是粗体。如果您想混合文本样式,建议使用HTML来为文本设置样式,然后使用以下代码。

tv.setText(Html.fromHtml(yourStringAsHtml));

我也考虑过使用Html.fromHtml(),但这会使得单独切换粗体、斜体和下划线变得更加困难,不是吗? - user1555863
这并不是一件容易的事情,但我认为你没有其他选择,因为文本样式适用于TextView中的所有文本。根据你想要做什么,你可以修改你的布局,并为可以加粗/下划线/斜体的内容创建单独的视图,但这只适用于非常静态的用例。 - Flynn81
@Flynn81 这就是我所想的,如果我设置了 BOLD_ITALIC 或 BOLD 并想取消 BOLD 部分,我必须注意文本的当前状态,除非我获取字体并调用 isBold()isItalic() - ilomambo
是的,我想不出任何优美的解决方案来实现你想要的目标。祝你好运,也许其他人可以提出更好的建议。 - Flynn81

6

仅仅创建一个新的字体就可以使 粗体 回到 正常

tv.setTypeface(Typeface.create(tv.getTypeface(), Typeface.NORMAL), Typeface.NORMAL);
tv.invalidate();

2

这段代码移除了旧的字体样式 setTypeface(null,Typeface.NORMAL);

如果想保留旧的字体样式,应该调用以下代码:

setTextViewStyle(textView, isBold);

private void setTextViewStyle(TextView view, boolean isBold){
    if (view == null)
        return;

    // if old typeface is null create new Typeface bold or def
    Typeface oldTypeface = view.getTypeface() != null ? view.getTypeface() :
            (isBold ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);

    view.setTypeface(
            Typeface.create(oldTypeface, isBold ? Typeface.BOLD : Typeface.NORMAL)
    );
}

如何将文本字体设为斜体? - Milan Tejani

1

如果你想保留TextView中设置的自定义字体,只是想去除加粗属性,可以尝试以下方法:

tv.getPaint().setFakeBoldText(false)

以下操作会移除我设置给TextView的自定义字体。
tv.setTypeface(null,Typeface.NORMAL);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接