【问题标题】:Android SharedPreferences, themes and the back buttonAndroid SharedPreferences、主题和返回按钮
【发布时间】:2011-06-01 14:36:00
【问题描述】:

我有一个通过 setTheme() 设置主题的简单活动,主题 ID 存储在 SharedPreferences 中,我在主活动中的 super.OnCreate() 之前获取此数据和 setTheme()。按下菜单按钮后,我可以启动首选项活动。在更新首选项并按后退按钮返回主要活动时,主题不会更新为新设置。只有关闭应用程序并重新打开才能解决此问题。

在偏好活动中按下后退按钮后,更新主活动并重新加载主题的最佳方法是什么?我尝试将 setTheme() 放入 OnResume 但无济于事。

非常感谢任何帮助,

谢谢瑞克

【问题讨论】:

    标签: android themes sharedpreferences back-button


    【解决方案1】:

    看到这个page

    Android 框架工程师 Dianne Hackborn 表示:

    您只能在 创建。要应用主题, 整个 UI 需要重新膨胀 从其资源中重建。

    【讨论】:

      【解决方案2】:

      如果没有其他方法,您可以在更新首选项后在您的活动中执行以下操作:

      Intent i = new Intent(this, YourActivity.class);
      startActivity(i);
      finish();
      

      不太优雅,希望有更简单的方法。

      【讨论】:

        【解决方案3】:

        主Activity中super.OnCreate()之前的setTheme()

        您不应该在 super.onCreate() 或 super.onResume() 之前放置任何代码,所有代码都应该放在这些调用之后。也许这就是问题所在。

        【讨论】:

          【解决方案4】:

          在您的活动中注册 onsharedpreferencechange 监听器

          【讨论】:

          • 虽然这可以回答问题,但最好包括解释为什么这是最好的做事方式,以及它比其他答案的优势。
          • 实现 onsharedpreferencechangelistener 是更新 UI 最简单的方法,第二个重要的事情是开发者将当前选择的主题保存在 sharedpreferences 中
          【解决方案5】:

          这是我的做法:

          我的应用在页面上有多个主题可供选择。 Normally, when a theme is selected and then the back button is pressed, the theme reverts back to the previous one.这是一个问题。

          我使用了 onBackPressed() 的 @Override 技巧来解决这个问题。以下是代码(我还修改了stack [my Navigation Drawer] 中第一个活动的代码)。

          @Override
          public void onBackPressed()
          {
              Intent intent1 = new Intent(this, NavigationActivity.class);
              startActivity(intent1);
              super.onBackPressed();  // optional depending on your needs
          }
          

          主题切换活动中的代码使得正常的后退按钮代码不会被调用来破坏当前活动并恢复到旧主题。它只是传递给用户之前使用的活动,即我的 NavigationActivity。随心所欲地自定义它。

          要注意的另一件事是,即使在此之后,后退按钮仍然会困扰您,因为一旦将我传递给 NavigationActivity,如果我再次按下后退按钮,主题就会恢复。我调用了与以前相同的方法,但我取出了导致还原的 super.onBackPressed(); 语句。这是它的样子:

          @Override
          public void onBackPressed() {
              DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
              if (drawer.isDrawerOpen(GravityCompat.START)) {
                  drawer.closeDrawer(GravityCompat.START);
              }
          }
          

          我希望这对你有用!

          【讨论】:

            【解决方案6】:

            如果您使用导航组件,请尝试如下所述。不需要调用intent 或finishActivity。

            override fun onBackPressed() {
                when (navController.currentDestination?.id){
                    R.id.settingsFragment -> super.onSupportNavigateUp()
                    else -> super.onBackPressed()
                }
            }
            

            super.onSupportNavigateUp() 将解决您的后退导航问题。

            【讨论】:

              猜你喜欢
              • 2012-10-28
              • 2014-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多