如何以编程方式应用样式?

我有一个名为红色和绿色的样式,我有一个if语句来找出哪个应用,但是我不知道代码实际应用java的样式。

Solutions Collecting From Web of "如何以编程方式应用样式?"

这个问题没有一个解决scheme,但是这对我的用例起作用。 问题是,'View(context,attrs,defStyle)'构造函数没有引用实际的样式,它需要一个属性。 所以,我们会:

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

在'res / values / attrs.xml'中定义一个新的属性:

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

在res / values / styles.xml中,我将创build我想在我的自定义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, int styleAttribute) { super(context, null, styleAttribute); } // You could also just apply your default style if none is given public CustomTextView(Context context) { super(context, null, R.attr.customTextViewStyle); } } 

通过所有这些组件,您现在可以执行if / else语句,以使用您喜欢的样式在运行时生成新的视图

 CustomTextView ctv; if(useCustomStyles == true){ ctv = new CustomTextView(context, R.attr.customTextViewStyle); }else{ ctv = new CustomTextView(context, R.attr.someOtherStyle); } 

值得注意的是,我反复在不同的变体和不同的地方使用了customTextView,但绝不要求视图的名称与样式,属性或者任何东西相匹配。 此外,这种技术应该适用于任何自定义视图,而不仅仅是TextView。

可以使用setTextAppearance (context, resid )方法将样式以编程方式应用于TextView。 (样式的resId可以在R.style.YourStyleName中find)

我发现这只能在Java内部创build视图时才能完成。 如果事先在XML中定义,则不能dynamic更改样式。

把这个代码

 super.setStyle(R.style.yourownstyle) 

在onCreate的setContentView()之前