在Android 5.0之后,有个新特性:Material Design
也可以在5.0之前使用,但是需要创建一个styles资源文件,并且version选择为level 21之上。
要注意的是:这里的Activity不能使用v4包下的ActivityCompat,只能使用Activity。
然后在styles中创建对应的主题,Google官方提供了3种默认的主题:
1.黑色主题: Theme.Material
2.明亮主题: Theme.Material.Light
3.明亮主题黑色: Theme.Material.Light.DarkActionBar
配置主题的时候:
colorPrimaryDark:状态栏的颜色
colorPrimary:ActionBar的颜色
textColorPrimary:ActionBar字体的颜色
windowBackground:界面背景颜色
navigationBarColor:比如华为手机下方按钮的颜色
并且我们可以直接在styles.xml这个文件的右上角,点击open editor,进入主题编辑器,直接编辑主题部分需要显示的颜色
然后就是主题切换部分:
我觉得这部分的逻辑就是,先写好一个主题的配置:比如:
<style name="RedTheme" parent="android:Theme.Material">
<!-- 状态栏颜色,会被statusBarColor效果覆盖-->
<item name="android:colorPrimaryDark">@color/status_red</item>
<!-- 状态栏颜色,继承自colorPrimaryDark -->
<item name="android:statusBarColor">@color/status_red</item>
<!-- actionBar颜色 -->
<item name="android:colorPrimary">@color/action_red</item>
<!-- 背景颜色 -->
<item name="android:windowBackground">@color/window_bg_red</item>
<!-- 底部栏颜色 -->
<item name="android:navigationBarColor">@color/navigation_red</item>
<!-- ListView的分割线颜色,switch滑动区域色-->
<item name="android:colorForeground">@color/fg_red</item>
<!-- popMenu的背景色 -->
<item name="android:colorBackground">@color/bg_red</item>
<!-- 控件默认颜色 ,效果会被colorControlActivated取代 -->
<item name="android:colorAccent">@color/control_activated_red</item>
<!-- 控件默认时颜色 -->
<item name="android:colorControlNormal">@color/control_normal_red</item>
<!-- 控件按压时颜色,会影响水波纹效果,继承自colorAccent -->
<item name="android:colorControlHighlight">@color/control_highlight_red</item>
<!-- 控件选中时颜色 -->
<item name="android:colorControlActivated">@color/control_activated_red</item>
<!-- Button的默认背景 -->
<item name="android:colorButtonNormal">@color/button_normal_red</item>
<!-- Button,textView的文字颜色 -->
<item name="android:textColor">@color/white_text</item>
<!-- RadioButton checkbox等控件的文字 -->
<item name="android:textColorPrimaryDisableOnly">@color/white_text</item>
<!-- actionBar的标题文字颜色 -->
<item name="android:textColorPrimary">@color/white_text</item>
</style>
然后定义一个静态变量,记录选择下来的主题。然后关闭当前Activity,再打开Activity。但是再打开的过程中,Activity的转场动画去除。
然后在Activity创建之前,对之前定义变量进行判断,通过setTheme方法选择主题。
以下是核心代码:
private void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
我写了一个简单的Demo,可以供大家参考: 点击打开链接