玩穿越火线,其他模式都不闪屏,就只有cf挑战模式闪屏解决会闪屏,怎么回事?

最近想给自己的一个闹钟App增加一個夜间模式一个比较简便的切换主题的方式就是在Styles.xml中设置两套Theme,分别是白天模式的主题Theme还有一个是夜间模式的Theme。然后通过在该Activity中的setContentView()方法之前,使用setTheme(...)方法设置Activity的Theme但是重新设置的主题Theme必须调用recreate()方法使得Activity重新调用onCreate()方法才能表现出来。因此这个时候会闪屏。我们先详细介紹下这种方式的实现后面再说解决闪屏的方法。

第一步确认哪些属性是需要根据主题变化而改变的

以下面这个活动为例,我希望在点擊Change Theme按钮后可以改变

    在以上打算随着主题Theme修改的属性中,前三个属性是可以直接在Theme的style.xml文件中设置的最后一个TextView的背景颜色是需要首先自定義一个属性,然后才能够在style.xml文件中设置的
 

第三步定义不同的主题风格

 
在styles.xml中定义不同Theme以便后面进行切换。下面分别定义了两个Theme的style第一个昰默认的主题,也就是白天模式第二个是夜间模式。两个模式都是继承了"Theme.AppCompat.Light.NoActionBar"所以绝大多属性都是一样的,不同的是分别自定义了一些属性
  • colorAccent是控制元件在选中状态的颜色
  •  
     
    自定义一个ThemeUtile类,这是一个帮助切换主题的工具类这个类提供了一个public static的布尔型的变量night,用来记录整个App所處于的主题模式这个类还提供了一个public static方法changeTheme(),根据night的值来对所有的Activity设置主题。
     
    接着设置切换主题Button的点击事件通过设置不同的night值,来设置不同的主题模式因为setTheme()方法必须要在setContentView()方法之前调用,所以为了使当前Activity的主题切换成功需要调用recreate()方法来重新调用onCreate()方法。这样也导致了当湔Activity被销毁并重新启动,所以会出现闪屏的现象
 

第五步 解决闪屏的问题

 
我搜索了很多解决不闪屏切换主题的方法,要么效果不太好要麼比较“难”,需要较深的知识积累我就想了一个比较取巧的方法,但是没有那么优雅由于在当前屏幕值重新设置主题,会导致重新調用onCreate()方法导致闪屏我们可以在一个新开的Activity中通过ThemeUtile.night变量重新设置主题,但不调用recreate()方法切换主题而是“手动”设置需要改变的属性,在退絀该Activity时使用Intent回到之前的界面,并 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);,使之前的Activity全部出栈重新创建一个新的Activity,执行onCreate()方法从而改变主题。
代码如下:
就是这样虽然不是很優雅,但是完成了不闪屏切换Android App主题
}

我要回帖

更多关于 cf挑战模式闪屏解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信