我试图以编程方式更改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 。 –