是否有一种方法来设置TextView的textStyle属性编程?似乎没有setTextStyle()方法。

需要明确的是,我不是在谈论视图/小部件样式!我说的是以下几点:

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

当前回答

textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface是属性文本样式。

正如Shankar V补充的那样,为了保留之前设置的字体属性,你可以使用:

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

其他回答

这个问题在很多地方以不同的方式被问到。我最初在这里回答了这个问题,但我觉得它在这个帖子中也是相关的(因为当我在寻找答案时,我在这里结束了)。

这个问题没有单一的解决方案,但这对我的用例是有效的。问题是,'View(context, attrs, defStyle)'构造函数并不引用实际的样式,它需要一个属性。因此,我们将:

定义一个属性 创建一个你想要使用的样式 在我们的主题上应用该属性的样式 用该属性创建视图的新实例

在'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,但它并不要求视图的名称与样式或属性或任何东西匹配。此外,这种技术应该适用于任何自定义视图,而不仅仅是textview。

textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface是属性文本样式。

正如Shankar V补充的那样,为了保留之前设置的字体属性,你可以使用:

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

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

TextViewCompat。setTextAppearance (textViewGoesHere渣油)

该方法在内部实现如下:

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);
    }
}

我用两个简单的方法解决了这个问题。

跟着解释走。

我现有的样式声明:

<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));

的问候。

• 科特林版本

保留当前字体和文本样式:

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