若是本文帮助到你,本人不胜荣幸,若是浪费了你的时间,本人深感抱歉。 但愿用最简单的大白话来帮助那些像我同样的人。若是有什么错误,请必定指出,以避免误导你们、也误导我。 本文来自:www.jianshu.com/users/320f9… 感谢您的关注。android
主题功能老早就想研究了,但是看了不少以后,发现想要很好的实现,并无什么简单的办法。 可是若是要求不高,实现起来仍是挺简单的。 一块儿来看一下。git
- 在 styles.xml 中定义不一样的主题风格;
而后来看每一步的详细操做:github
也就是定义多种风格的主题,设置不一样的颜色等。框架
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!--Toolbar的背景颜色-->
<item name="colorPrimary">@color/colorPrimary</item>
<!--StatusBar的颜色-->
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<!--主标题的字体颜色-->
<item name="android:textColorPrimary">@color/textColorPrimary</item>
<!--控制元件的默认状态颜色-->
<item name="android:colorControlNormal">@color/colorControlNormal</item>
<!--控制元件在选中状态的颜色-->
<item name="colorAccent">@color/colorAccent</item>
<!--Activity的背景颜色-->
<item name="android:windowBackground">@color/windowBackground</item>
<!--自定义的属性-->
<item name="Text_bg_Color">@color/Text_bg_Color</item>
</style>
<style name="AppThemeNight" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/NcolorPrimary</item>
<item name="colorPrimaryDark">@color/NcolorPrimaryDark</item>
<item name="android:textColorPrimary">@color/NtextColorPrimary</item>
<item name="android:colorControlNormal">@color/NcolorControlNormal</item>
<item name="colorAccent">@color/NcolorAccent</item>
<item name="android:windowBackground">@color/NwindowBackground</item>
<item name="Text_bg_Color">@color/NText_bg_Color</item>
</style>
</resources>
复制代码
大多时候,系统自带的属性并不够用,因此就须要自定义一些属性,好比说上面的最后一个属性。 自定义方法以下less
在values文件夹下,新建attrs.xml文件,定义本身的属性。ide
<resources>
<attr name="Text_bg_Color" format="color"/>
</resources>
复制代码
布局文件中,在须要改变色调的位置,设置相应的属性。布局
public class MainActivity extends AppCompatActivity {
/**
* recreate() 会使 Activity 从新刷新,因此 这个标志必须是静态的。
*/
private static boolean night = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
changeTheme();
setContentView(R.layout.activity_main);
findViewById(R.id.email_sign_in_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
change();
}
});
}
private void change() {
night = !night;
changeTheme();
recreate();// 重启 Activity
}
/**
* 根据标志改变主题
*/
private void changeTheme() {
if (night) {
setTheme(R.style.AppThemeNight);
} else {
setTheme(R.style.AppTheme);
}
}
}
复制代码
到此,就能够实现一个最基本的切换主题了,这样也是会有一个问题,也就是闪屏。 可是若是要求不是很高,这也是能够知足需求的。 此项目代码: github.com/Wing-Li/And…字体
闪屏也是你们想尽各类办法想要解决的一个问题。spa
在此写下你们解决的思路。3d
再也不使用 setTheme(); 而是将当前 Activity 上的每一个控件,分别改为本身设定的颜色。
对,没错,就是修改每一个控件。 各类解决办法,也就是看使用什么办法能够更方便的修改多个控件。
找到了两个切换主题的框架,从源码中很明显的能够看出,他们都是把经常使用的基本控件重写的一遍,而咱们要使用这个框架的时候,也必须使用框架所提供的控件。
当调用了切换主题的方法后,会遍历使用的控件修改相应的颜色,从而达到 不闪屏切换主题的效果。
因此仍是有一些其余的方式,目的仍是那句话:使用更好的方式修改多个控件的颜色。 这篇文章介绍的方法,感受不错:知乎和简书的夜间模式实现套路 前面都大同小异,主要是修改颜色的那一段代码。
将其项目提炼后,只剩修与修改主题相关代码: github.com/Wing-Li/And…
好了,本文就分享到这里。 若是有什么更好的方式,请必定告知。