主题切换时的转换(或Activity.recreate())

时间:2015-03-04 02:23:04

标签: android android-activity themes android-resources

我的目标是API级别14+,所以我在我的应用中使用Activity.recreate()进行主题切换。它效果很好,除了黑屏会闪烁约0.5秒。

我曾经认为在这里提供更好的体验是不可能的,直到我看到一个材料设计的应用程序成功切换其主题与交叉淡入淡出。但不幸的是,我不记得它的名字,因为我不久前从手机上卸下了它。

我尝试过Activity.overridePendingTransition(),它没有用,我相信原因是recreate()调用很像配置更改,所以机制不同于完成和启动一个全新的活动。


(在尝试找到该应用程序时,我遇到了另一个神奇的主题切换应用程序,即使没有调用recreate()。哼......有人知道这个技巧是如何完成的吗?)

Theme switching on the fly GIF

Who said themes were immutable? Changing the primary and accent colors on…


编辑:

我发现上面的GIF对原始问题有点分心,所以我把它变成了一个链接。

我最初的问题是,是否有任何方法可以通过适当的过渡来更改(切换)主题?

通过Brute force更改屏幕上的所有内容并不会切换应用程序的主题;它似乎只是,但它可能导致许多问题。

悲哀地发现了上述GIF可能只是哈克蛮力攻击,但仍感谢@Emanuel Moecklin指出了这一点。

但我仍然希望“(真正的)切换主题与过渡”解决方案可以出现,或者有人告诉我Activity.recreate()无法动画,没有其他方法可以更好地切换主题。

2 个答案:

答案 0 :(得分:0)

查看类似问题的答案: https://stackoverflow.com/a/26511725/534471

您在问题中提到的应用程序是什么,不是更改主题,而是更改状态栏,操作栏和导航栏的颜色:

状态栏:

getWindow().setStatusBarColor(colorStatus);

行动栏:

ActionBar actionBar = getSupportActionBar();
actionBar.setBackgroundDrawable( new ColorDrawable( colorAction ) );

导航栏:

getWindow().setNavigationBarColor(colorStatus);

我的猜测是只需设置两个可见元素的背景颜色(浮动操作按钮和标签导航)即可更改强调颜色。标签导航颜色可以像这样更改:

ActionBar actionBar = getSupportActionBar();
actionBar.setStackedBackgroundDrawable( new ColorDrawable( accentColor ) );   

答案 1 :(得分:0)

这些年来,我学会了一种简单的方法。

使用以下代码片段代替Activity.recreate()

finish();
startActivity(new Intent(this, getClass()));
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

这将在主题之间为您提供漂亮的动画。

奖金:您可以通过覆盖dispatch*Event()上与输入相关的方法(Activity)来手动保存和恢复实例状态以保留UI状态,并在重新启动期间忽略用户输入。