如何在运行时更改TextView的样式

103

我有一个Android应用程序,在用户点击 TextView 时,我想应用一个定义好的样式。

我尝试过寻找 textview.setStyle(),但它并不存在。我尝试了...

textview.setTextAppearance();

但是它不起作用。


1
我曾经在某个地方读到过这是不可能的......https://dev59.com/mHI-5IYBdhLWcg3wF0Uc。但是你可以单独设置一些属性。 - Floern
1
你尝试过使用textView.setTextTypeface吗?http://developer.android.com/reference/android/widget/TextView.html#setTypeface(android.graphics.Typeface) - Jonathan Roth
21
дҪ жҳҜеҗҰзңӢиҝҮTextViewзҡ„APIж–ҮжЎЈпјҹеҰӮжһңжҳҜиҝҷж ·пјҢдҪ иғҪеҗҰжҸҗдҫӣжӣҙжңүе»әи®ҫжҖ§зҡ„ж„Ҹи§ҒгҖӮ - Fletch
7个回答

144

我通过创建一个新的 XML 文件 res/values/style.xml 来实现这个功能:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

我在我的"strings.xml"文件中也有这样的条目:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

然后,在我的代码中,我创建了一个ClickListener来捕获该TextView上的点击事件: 编辑: 从API 23开始,'setTextAppearance'已被弃用

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

要将其改回,您需要使用以下内容:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);

2
实际上,这种方法不适用于阴影样式。如果您想更改阴影,必须按照以下方式进行操作: lockText.setShadowLayer(20, 4, 4, 0xFFFF0000); - Lukas
4
为了避免SDK的检查,您可以使用TextViewCompat.setTextAppearance(myTextView, R.style.myStyle);来设置文本样式。 - Justin Fiedler

91

像Jonathan建议的那样,使用textView.setTextTypeface可以解决问题。我只是在几秒钟之前在一个应用程序中使用了它。

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.

9
您可以使用以下代码更改TextView的字体样式:
  • 加粗字体:textView.setTypeface(null, Typeface.BOLD);
  • 斜体字体:textView.setTypeface(null, Typeface.ITALIC);
  • 加粗斜体字体:textView.setTypeface(null, Typeface.BOLD_ITALIC);
- peceps
2
textView.setTypeface(null, Typeface.BOLD) 是我使用的方法。当然,你也可以使用1,但是手动输入常量并不是一个好习惯。最好使用库中预定义的变量。 - Pijusn
4
不要鼓励人们使用整数代替常量。 - Chris.Jenkins
3
好的!我的错误在于我在第一个参数中发送了旧的字体,所以当我将NORMAL改为BOLD时它可以工作,但是将BOLD改为NORMAL则不能。我不知道第一个参数可以是null!现在对我来说它可以工作得很好! - Felipe

12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

您可以通过代码设置它。 Typeface


2
我发现textView.setTypeface(Typeface.DEFAULT_BOLD);是最简单的方法。

这会更改字体,而不是OP指定的样式。 - HBG
是的,这仍然是最简单的方法 - 就我所记得的而言,也是唯一的方法 - 在发布文章时。我不确定是否在此期间添加了新的API方法,使得可以在不改变字体的情况下更改“样式”为粗体。如果我说错了,请纠正我。 - sfera

1

尝试这行代码。

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

这里,它将从此TextView获取当前字体,并使用新的字体替换它。新的字体在这里是DEFAULT_BOLD,但您可以应用更多。

你最好解释一下为什么你的代码能够解决他的问题,谢谢。 - Muhammed Refaat
OP想要改变风格,而不是字体。 - HBG

0

根据您想要设置的样式,您必须使用不同的方法。TextAppearance有自己的setter,TypeFace有自己的setter,背景有自己的setter等。


0

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