Answers:
我不认为您可以通过编程方式设置样式。为了解决这个问题,您可以创建具有指定样式的模板布局xml文件,例如在res / layout中,创建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);
希望这可以帮助。
您可以创建通用样式,然后在多个文本视图上重新使用它,如下所示:
textView.setTextAppearance(this, R.style.MyTextStyle);
编辑:这是指上下文
TextViewCompat.setTextAppearance
您可以像这样将ContextThemeWrapper传递给构造函数:
TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
<style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>
。然后,我用建筑调用它:new Button(new ContextThemeWrapper(context, R.style.TabButton));
。但是按钮只是忽略了我的设置。我在这里做错什么吗?
parent="@android:style/Widget.Button"
parent
没有改变。因此,我只是着手inflate
解决方案。
new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)
。否则,将应用默认的按钮样式,并且该样式将覆盖通过ContextThemeWrapper合并到主题中的按钮样式。
您可以在构造函数中设置样式(但是不能动态更改/设置样式)。
View(Context, AttributeSet, int)
(这int
是当前主题中的一个属性,其中包含对样式的引用)
参数int defStyleAttr
不指定样式。从Android文档中:
defStyleAttr-当前主题中的属性,其中包含对样式资源的引用,该样式资源为视图提供默认值。可以为0表示不查找默认值。
要在View构造函数中设置样式,我们有2种可能的解决方案:
使用ContextThemeWrapper:
ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
TextView textView = new TextView(wrappedContext, null, 0);
使用四参数构造函数(从LOLLIPOP开始可用):
TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
两种解决方案的关键 - defStyleAttr
参数应为0才能将样式应用于视图。
目前尚不支持动态更改样式。您必须通过XML创建视图之前设置样式。
我也遇到了这个问题,并且找到了以编程方式设置样式的方法。也许大家都需要,所以我在那里更新。
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);
以编程方式创建的视图将在主题中使用指定的样式。
您可以尝试一下,希望它可以完美地为您工作。
我只用EditText测试过,但是可以使用
公共无效setBackgroundResource(int resid)
应用在XML文件中定义的样式。
当然,此方法属于View,我相信它将与任何UI元素一起使用。
问候。
我们可以使用TextViewCompact.setTextAppearance(textView, R.style.xyz)
。
Android 文档供参考。