前期准备
- 介绍一个主题切换框架Colorful,非常强大的一个框架,具体使用请去github查看。
- 熟悉一下 registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)使用,如果对这块不太懂可要好好了解一下activity的生命周期了。
开始食用
初始化主题
- 在application里初始化主题和生命周期的监听
/** * 项目名称 * Created by Long on 2019/3/14. * 修改时间:2019/3/14 17:29 */ class ADBApplication : Application() { companion object { lateinit var instances: ADBApplication } init { instances = this } override fun onCreate() { super.onCreate() LogUtil.debug(true) SmartShow.init(this) val defaults: Defaults = Defaults( primaryColor = ThemeColor.ORANGE, accentColor = ThemeColor.BLUE_GREY, useDarkTheme = false, translucent = false) initColorful(this, defaults) registerActivityLifecycleCallbacks(ADBActivityLifecycleCallbacks()) } //由于 ActivityLifecycleCallbacks 中所有方法的调用时机都是在 Activity 对应生命周期的 Super 方法中进行的, // 所以在 Activity 的 onCreate 方法中使用 setContentView // 必须在 super.onCreate(savedInstanceState); 之前, // 不然在 onActivityCreated 方法中 findViewById 会发现找不到 @Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") private class ADBActivityLifecycleCallbacks : ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) { Colorful().apply(activity!!, override = true, baseTheme = BaseTheme.THEME_MATERIAL) } override fun onActivityPaused(activity: Activity?) { LogUtil.i(msg = activity!!.localClassName) } override fun onActivityResumed(activity: Activity?) { when(activity){ !is SettingsActivity->{ LogUtil.i(msg = activity!!.localClassName) if(ThemeManager.lastTheme!=ThemeManager.nowTheme) { activity!!.recreate() ThemeManager.lastTheme=ThemeManager.nowTheme } } } } override fun onActivityStarted(activity: Activity?) { LogUtil.i(msg = activity!!.localClassName) } override fun onActivityDestroyed(activity: Activity?) { LogUtil.i(msg = activity!!.localClassName) } override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) { LogUtil.i(msg = activity!!.localClassName) } override fun onActivityStopped(activity: Activity?) { LogUtil.i(msg = activity!!.localClassName) } } }
- 了解一下activity生命周期
图片引用自 点击查看
- 因为activity在充前台到后台需要-走>onRestart->onStart->onResume所以我们在onActivityResumed中对activity进行重建以应用主题修改。如此就实现了无缝切换功能。