2016-03-09 97 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在整个构建中都会更改。