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


98

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

我以为找到一个,textview.setStyle()但它不存在。我试过了

textview.setTextAppearance();

但它不起作用。


1
我读过某处这是不可能的... stackoverflow.com/questions/2016249/…。但是您可以单独设置一些属性。
2011年

1
您是否尝试过:textView.setTextTypeface?developer.android.com/reference/android/widget/…–
乔纳森·罗斯

21
@Falmarri您是否浏览了TextView api文档?如果是这样,也许您可​​以说些更具建设性的话。
Fletch 2012年

Answers:


143

我通过创建一个新的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上的tap事件: 编辑: 自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);
卢卡斯

3
为了避免SDK检查,您可以使用TextViewCompat.setTextAppearance(myTextView,R.style.myStyle);
贾斯汀·菲德勒

90

就像乔纳森(Jonathan)所建议的那样,在使用textView.setTextTypeface作品时,我只是在几秒钟前在一个应用程序中使用过它。

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

9
您可以使用textView.setTypeface(null,Typeface.BOLD); textView..setTypeface(null,Typeface.ITALIC); textView.setTypeface(null,Typeface.BOLD_ITALIC);
2011年

2
textView.setTypeface(null,Typeface.BOLD)对我有用。当然,您可以改用1,但是我想手动输入常量不是一个好习惯。更好地使用库中的预定义变量。
Pijusn 2012年

4
不要鼓励人们使用整数而不是常量
Chris.Jenkins 2012年

3
好一个!我的错误是我在第一个参数中发送了旧字体。因此,当我更改NORMAL-> BOLD而不是BOLD-> NORMAL时,它确实起作用。我不知道第一个参数可以为null!现在对我来说很好!
费利佩2012年

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

您通过代码进行设置。字体


4

以编程方式:运行时

您可以使用setTypeface()以编程方式进行操作:

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML:设计时间

您还可以设置XML:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

希望这会有所帮助

总结


2

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


这将更改字体。不是 OP指定的样式。
HBG

没错,在发帖时,这仍然是最简单的方法-就我所记得的唯一方法。我不确定在此期间是否添加了新的API方法,该方法可以将“样式”更改为粗体而不更改字体。如果我错了,请纠正我。
sfera

1

尝试这一行代码。

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

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


您宁愿解释一下为什么您的代码将解决他的问题,谢谢。
Muhammed Refaat

OP希望更改样式,而不是字体。
HBG


0

根据要设置的样式,必须使用不同的方法。TextAppearance东西具有自己的设置器,TypeFace具有其设置器,背景具有其设置器,等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.