2016-03-09 143 views
1

我試圖以編程方式更改colorPrimarycolorAccent,但我找不到與它們相關的任何方法,例如setThemeColorPrimary(int color)。我發現的唯一方法是通過Java reflection進行更改。但是,我無法找到要反映的colorPrimarycolorAccent字段。通過反射改變顏色主色和顏色

那麼,如何以編程方式更改colorPrimarycolorAccent

在此先感謝。

+0

你打算這麼做的意圖是什麼?爲什麼不以編程方式設置另一種顏色? –

+0

@ThomasR。,我想在運行時更改'colorPrimary'和'colorAccent',以便其他Android小部件也會改變它們的顏色,例如'FloatingActionButton'的顏色和'ViewPager'的邊緣效果顏色。如果我在'styles.xml'中使用了很多主題選項,這可以讓我的apk變大。 –

+0

邊緣效果顏色可以被'android:edgeEffectColor'覆蓋。然後它可以通過反射在運行時更改,請參閱此類https://github.com/consp1racy/android-commons/blob/master/android/src/main/java/net/xpece/android/widget/XpEdgeEffect.java 。 –

回答

1

據我所知,這是不可能的,你不能訪問colorAccent和colorPrimary字段,這不是Android資源編譯過程的工作方式。

沒有這樣的東西作爲Theme.colorPrimary,要訪問您需要使用obtainStyledAtributtes()或類似技術的主題屬性。

我知道以編程方式做的唯一方法是使用setTheme()方法或使用ContextThemeWrapper()。這兩種方式都需要你在XML中有多個樣式聲明。

0

無法覆蓋主題屬性!


1)如果您不想手動更新每個視圖,請繼續閱讀。

2)如果您有預定義的主要和重點顏色組合,請繼續閱讀。

有一對夫婦與基本色和強調色預定義的主題覆蓋的規定:

<style "ThemeOverlay.MyApp.Red" parent=""> 
    <item name="colorPrimary">#ff0000</item> 
    <item name="colorPrimaryDark">#880000</item> 
    <item name="colorAccent">#00ffff</item> 
</style> 

<style "ThemeOverlay.MyApp.Blue" parent=""> 
    <item name="colorPrimary">#0000ff</item> 
    <item name="colorPrimaryDark">#000088</item> 
    <item name="colorAccent">#ffff00</item> 
</style> 

<!-- Green, orange, etc. --> 

現在,你可以用任何背景和覆蓋只是

Context newContext = new ContextThemeWrapper(context, R.style.ThemeOverlay_MyApp_*); 

這三個屬性這是夠用了膨脹視圖或手動創建它們。

如何使其自動進行所有活動?創建一個BaseActivity,您的所有活動都將延伸。本次活動將更新它的主題,像這樣:

@Override 
public void onCreate(Bundle icicle) { 
    final SharedPreferences prefs = ...; 
    final String themeColor = prefs.getString("themeColor", ""); // Non-null! 
    final int themeResId; 
    switch (themeColor) { 
     "BLUE": 
      themeResId = R.style.ThemeOverlay_MyApp_Blue; 
     default: 
      themeResId = R.style.ThemeOverlay_MyApp_Red; 
    } 
    setTheme(themeResId); 

    super.onCreate(icicle); 
    // etc. 
} 

哪裏themeResId是上面定義的主題覆蓋之一的資源ID。我假設顏色主題是您的應用中的用戶首選項,並且您存儲了一個字符串,如"RED""BLUE",您可以在運行時將其轉換爲主題資源ID。不要將資源ID存儲到首選項,ID在整個構建中都會更改。