260

我正在尝试使用TextView具有如下样式的构造函数:

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

但是,当我这样做时,文本视图似乎没有采用该样式(我通过将其设置在静态对象上来验证该样式)。

我也尝试过使用myText.setTextAppearance(MyActivity.this, R.style.my_style),但它也不起作用。

4

12 回答 12

329

我不相信您可以以编程方式设置样式。为了解决这个问题,您可以创建一个指定样式的模板布局 xml 文件,例如在 res/layout create tvtemplate.xml 中,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

然后膨胀这个来实例化你的新TextView:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);
于 2011-03-30T15:42:55.983 回答
127

您可以创建一个通用样式并在多个文本视图上重新使用它,如下所示:

textView.setTextAppearance(this, R.style.MyTextStyle);

编辑:是指上下文

于 2012-10-05T11:19:30.497 回答
102

您可以像这样将ContextThemeWrapper传递给构造函数:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
于 2013-07-03T07:56:10.460 回答
17

您可以在构造函数中设置样式(但样式不能动态更改/设置)。

View(Context, AttributeSet, int)(这int是当前主题中的一个属性,包含对样式的引用)

罗曼盖伊的回答

参考

于 2013-02-19T02:22:55.360 回答
15

参数 intdefStyleAttr不指定样式。来自 Android 文档:

defStyleAttr - 当前主题中的一个属性,它包含对为视图提供默认值的样式资源的引用。可以为 0 以不查找默认值。

要在 View 构造函数中设置样式,我们有两种可能的解决方案:

  1. 使用 ContextThemeWrapper:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
    
  2. 使用四参数构造函数(从 LOLLIPOP 开始可用):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
    

两种解决方案的关键-defStyleAttr参数应为 0 以将我们的样式应用于视图。

于 2017-02-05T16:04:35.147 回答
5

(尚)不支持动态更改样式。您必须在创建视图之前通过 XML 设置样式。

于 2011-03-30T15:45:45.177 回答
3

接受的答案对我来说是很好的解决方案。唯一要补充的是inflate()方法。

在接受的答案中,所有android:layout_*参数都不会被应用。

原因是没有办法调整它,原因null被传递为ViewGroup parent.

你可以像这样使用它:

View view = inflater.inflate(R.layout.view, parent, false);

parentViewGroup,你喜欢从哪里调整android:layout_*

在这种情况下,将设置所有相关属性。

希望它对某人有用。

于 2015-04-10T00:40:30.460 回答
2

当使用可能使用样式继承(或事件样式属性)的自定义视图时,您必须修改第二个构造函数以免丢失样式。这对我有用,无需使用setTextAppearence()

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}
于 2014-01-10T22:47:04.810 回答
2

我也遇到了这个问题,我找到了以编程方式设置样式的方法。也许你们都需要它,所以我在那里更新。

View 构造函数的第三个参数在您的主题中接受一种 attr 作为以下源代码:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

所以你必须传递一种 R.attr.** 而不是 R.style.**

在我的代码中,我执行了以下步骤:

首先,在 attr.xml 中自定义一个供主题使用的自定义 attr。

<attr name="radio_button_style" format="reference" />

其次,在 style.xml 中指定您使用的主题中的样式。

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

最后,使用它!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

以编程方式创建的视图将使用主题中的指定样式。

你可以试一试,希望它能完美地为你工作。

于 2016-10-17T03:38:46.493 回答
1

我们可以使用TextViewCompact.setTextAppearance(textView, R.style.xyz).

Android文档供参考。

于 2019-09-02T09:41:18.143 回答
0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
    textView.setTextAppearance(R.style.yourStyle)
于 2020-07-17T19:20:40.177 回答
-1

我只用 EditText 测试过,但你可以使用该方法

公共无效 setBackgroundResource (int resid)

应用在 XML 文件中定义的样式。

因为这个方法属于 View 我相信它适用于任何 UI 元素。

问候。

于 2012-07-11T15:41:52.193 回答