在activity中调用setTheme来切换夜间模式的方法可能大家有看过相关的文章了,但是调用setTheme设置的主题后界面并没有变化,这时需要调用activity的recreate方法另设置的主题生效,但是试过的朋友们都知道,activity调用recreate方法以后会有一瞬间的闪屏今天写这篇文章的主题主要是关于如何避免setTheme切换主题后调用recreate的闪屏
关于如何通过改变theme更换主题的文章如果您还没有看过的话可以看一下这篇文章或者自行搜索一下recreate
recreate.gif
效果实现
1.属性动画 实现
使用属性动画配合ArgbEvaluator这个类来对所有需要变换颜色的View设置一个渐变动画属性动画
anim.gif
|
这个方法的缺点有一下几个:只要是需要有颜色变化的View要设置id并通过findViewById获取其对象,增加代码量,大家都知道设置id写findViewById有多蛋疼吧(笔者最讨厌设置控件的id了)
每一个设置的attr的color就需要写一个属性动画,代码量又增多了
RecyclerView或ListView还有某些特殊控件如何进行颜色改变(如MD风格的Button RadioButton Switch 等不能通过设置background改变颜色的控件)
接下来来看一下代码中如何实现吧
通过以下方法获取主题中设置的attrs对应颜色/**
* @param theme 需要获取attrs颜色的theme
* @param id 需要获取的attrs颜色id
* @return color
*/public static int getColorFromTheme(Resources.Theme theme, @AttrRes int id)
{
TypedValue ty