Android-以编程方式设置TextView TextStyle?


232

有没有办法以编程方式设置textStyle属性TextView?似乎没有setTextStyle()方法。

明确地说,我不是在谈论视图/小部件样式!我在谈论以下内容:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
您可以在下面的链接中引用,并锁定顶部1个答案 stackoverflow.com/questions/6200533/…–
Tiep

在这里检查我的答案。希望这对您有所帮助
Summved Jain

Answers:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface是属性textStyle。

正如Shankar V添加的那样,要保留以前设置的字体属性,可以使用:

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

14
应该是textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin保留先前设置的字体,您需要像这样使用它。
Sankar V

根据@SankarV评论编辑了我的答案。
拉兹2015年

13
我认为您应该放弃默认值:holder.title.setTypeface(holder.title.getTypeface(),Typeface.BOLD);
伊曼·阿克巴里

实际上textview.getTypeface().getStyle()android:textStyle
Pierre

126

假设您在values / styles.xml上有一个名为RedHUGEText的样式:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

只需照常在XML layout / your_layout.xml文件中创建TextView,就可以说:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

然后在您的Activity的Java代码中执行以下操作:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

它为我工作!它应用了颜色,大小,重力等。我已经在Android API级别为8到17的手机和平板电脑上使用了它,没有问题。请注意,自Android 23起,该方法已被弃用。删除了context参数,因此最后一行需要为:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

请记住...仅当文本样式确实取决于您的Java逻辑条件或您正在使用代码“即时”构建UI时,此方法才有用...如果不是,则最好仅做:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

您可以随时随地使用它!


4
这只会设置可以在<style>标记中定义的属性的子集。它执行常见的操作(大小,颜色,样式),但不执行其他操作(包括填充,背景,重力等)
2014年

5
似乎需要最低API 23?
William T. Mallard

4
有两种方法,一种用于api <23,另一种用于api 23+。它们看起来相同,除了<23的一个带有上下文参数,而23+的一个不带上下文参数。在后台,用于api 23+的那个调用<23的方法,并将成员上下文用于textview。
MrPlow


52

以下是实现此任务的许多方法:

1。

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2。

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3。

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4。

<?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>

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

或者如果你想通过xml

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

setTextAppearance()是我想要应用XML中定义的自定义样式的答案。谢谢。
ashario '18 -4-8

我认为,这是该线程的最佳答案。以编程方式调用代码的许多选项
Nguyen Minh Hien

9

Kotlin Version

要保留除文字样式外的当前字体:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}

7

这个问题在很多地方以许多不同的方式提出。我最初在这里回答了这个问题,但我觉得它在该主题中也很重要(因为我在这里寻找答案时就在这里结束了)。

对于这一问题,没有一线解决方案,但这在我的用例中有效。问题是,“ View(context,attrs,defStyle)”构造函数没有引用实际的样式,而是需要一个属性。因此,我们将:

  1. 定义一个属性
  2. 创建您要使用的样式
  3. 在我们的主题上对该属性应用样式
  4. 使用该属性创建视图的新实例

在“ res / values / attrs.xml”中,定义一个新属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

在res / values / styles.xml中,我将创建要在自定义TextView上使用的样式

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

在“ res / values / themes.xml”或“ res / values / styles.xml”中,为您的应用程序/活动修改主题并添加以下样式:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

最后,在自定义TextView中,您现在可以将构造函数与属性一起使用,它将接收您的样式

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

值得注意的是,我在不同的变体和不同的地方重复使用了customTextView,但绝不需要视图的名称与样式或属性相匹配。另外,此技术应可用于任何自定义视图,而不仅仅是TextViews。


5

这对我有用

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

要么

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

我用两种简单的方法解决了它。

按照说明进行操作。

我现有的样式声明:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

我的Android Java代码:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

问候。


0

你可以试试这个

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }

0

由于setTextAppearance(resId)仅适用于API 23及更高版本,请使用:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

此方法在内部实现如下:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}

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.