2011-09-21 78 views
6

我没有找到一种方法来做到这一点编程,所以我在这里发布这个问题(我也没有发现任何与此相关的问题)。以编程方式应用样式资源

我有一个资源样式,在res/values/styles.xml中定义。我想要做的是在我的活动中使用java将这种风格应用到我操纵的View对象中。

是否有可能在Android中实现这一点,或者风格只能应用于使用android:style属性的对象?

回答

3

不,一般不会将样式资源应用于现有View实例。风格资源只能在施工期间应用到Views。

要理解为什么研究View(Context context, AttributeSet attrs, int defStyle)构造函数。这是唯一读取中央视图属性(如android:background)的地方,因此在构建View之后无法应用样式。视图的子类使用相同的模式,如TextView。您将需要使用setter手动应用样式属性。

请注意,如果您主动实例化视图,则可以通过defStyle构造函数参数使用任何样式资源。

+0

我没有以编程方式实例化视图。它是我创建的一个自定义视图,它扩展了LinearLayout ...所以我希望不要让用户使用style =“@ style/...”,我想以编程方式应用样式,但使用样式资源而不是以该现有样式的属性编程式应用属性。 – Thiago

+0

“请注意,如果您主动实例化视图,则可以通过defStyle构造函数参数使用任何样式资源。” 你做了这件事吗? 我遇到问题并且在搜索时发现了这个问题。 http://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=12683 – sadaf

2

至少在一个TextView这是可能使用setTextAppearance(context, resid)方法:可以在View对象这样的构造给予风格。 resId的风格可以在R.style.找到。

+0

好吧,其实我需要应用整个视图的样式...例如LinearLayout或RelativeLayout。 – Thiago

+0

创建后您无法更改视图,但是您可以为View类的构造函数提供自定义样式。 [链接](http://groups.google.com/group/android-developers/browse_thread/thread/88c53b8c790a750d) – crnv

5

分享此答案here,但由于它有自己的会话线程,所以我觉得它在这里也是相关的。

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

  1. 定义属性
  2. 创建要使用
  3. 应用样式该属性对我们的主题
  4. 与属性
  5. 创建我们认为新的实例风格

在 'RES /值/ attrs.xml',定义一个新的属性:

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

在RES /价值/ 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 /价值/的themes.xml' 或' RES /价值/样式。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。

相关问题