【问题标题】:Transition when theme switching (or Activity.recreate())主题切换时的过渡(或 Activity.recreate())
【发布时间】:2015-03-04 02:23:04
【问题描述】:

我的目标是 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 有点分散了原始问题的注意力,所以我把它变成了一个链接。

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

通过蛮力更改屏幕上的所有内容不是切换应用程序的主题;虽然看起来是这样,但它会导致很多问题。

很遗憾发现上面的 GIF 可能只是一个 hacky 蛮力攻击,但仍然感谢 @Emanuel Moecklin 指出这一点。

但我还是希望能有一个“(真正的)用过渡切换主题”的解决方案,或者有人告诉我 Activity.recreate() 不能动画,没有其他方法可以更好地切换主题。

【问题讨论】:

    标签: android android-activity themes android-resources


    【解决方案1】:

    经过这么多年,我学会了一个简单的方法。

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

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

    它会给你一个很好的主题之间的动画。

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

    【讨论】:

      【解决方案2】:

      查看类似问题的答案: 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 ) );   
      

      【讨论】:

      • 不仅如此,您还可以观察到ListViews 在其他选项卡中的分隔符和箭头也改变了它的强调色。这个技巧真的很老套吗,它只是手动更改所有选项卡中的所有内容吗?
      • 感谢您的回答,我也稍微更新(并澄清)了我的问题。
      • 酷。得到答案后改变问题。祝你好运找到一个人来浪费他们的时间。
      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2013-08-14
      • 2021-07-14
      • 2021-04-26
      • 2011-12-03
      相关资源
      最近更新 更多