2011-09-21 91 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。