我試圖以編程方式更改colorPrimary
和colorAccent
,但我找不到與它們相關的任何方法,例如setThemeColorPrimary(int color)
。我發現的唯一方法是通過Java reflection進行更改。但是,我無法找到要反映的colorPrimary
和colorAccent
字段。通過反射改變顏色主色和顏色
那麼,如何以編程方式更改colorPrimary
和colorAccent
?
在此先感謝。
我試圖以編程方式更改colorPrimary
和colorAccent
,但我找不到與它們相關的任何方法,例如setThemeColorPrimary(int color)
。我發現的唯一方法是通過Java reflection進行更改。但是,我無法找到要反映的colorPrimary
和colorAccent
字段。通過反射改變顏色主色和顏色
那麼,如何以編程方式更改colorPrimary
和colorAccent
?
在此先感謝。
據我所知,這是不可能的,你不能訪問colorAccent和colorPrimary字段,這不是Android資源編譯過程的工作方式。
沒有這樣的東西作爲Theme.colorPrimary,要訪問您需要使用obtainStyledAtributtes()
或類似技術的主題屬性。
我知道以編程方式做的唯一方法是使用setTheme()
方法或使用ContextThemeWrapper()
。這兩種方式都需要你在XML中有多個樣式聲明。
無法覆蓋主題屬性!
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在整個構建中都會更改。
你打算這麼做的意圖是什麼?爲什麼不以編程方式設置另一種顏色? –
@ThomasR。,我想在運行時更改'colorPrimary'和'colorAccent',以便其他Android小部件也會改變它們的顏色,例如'FloatingActionButton'的顏色和'ViewPager'的邊緣效果顏色。如果我在'styles.xml'中使用了很多主題選項,這可以讓我的apk變大。 –
邊緣效果顏色可以被'android:edgeEffectColor'覆蓋。然後它可以通過反射在運行時更改,請參閱此類https://github.com/consp1racy/android-commons/blob/master/android/src/main/java/net/xpece/android/widget/XpEdgeEffect.java 。 –