安卓app切换主题,实现无缝切换的思考

前期准备

  • 介绍一个主题切换框架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生命周期
    图片引用自[a]https://blog.csdn.net/u010072711/article/details/77090313

    图片引用自 点击查看

  • 因为activity在充前台到后台需要-走>onRestart->onStart->onResume所以我们在onActivityResumed中对activity进行重建以应用主题修改。如此就实现了无缝切换功能。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林深人不知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值