【问题标题】:How to apply night mode without reloading fragment?如何在不重新加载片段的情况下应用夜间模式?
【发布时间】:2019-12-05 08:52:17
【问题描述】:

我在我的 android 项目中使用了灯光/夜间模式,并在片段中使用了一个开关来更改模式。好吧,当我重新加载应用程序时它会改变。但我想在不重新加载应用程序的情况下更改模式。我该怎么做???

  • 我想在更改模式时保留当前片段。

    aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if(b){
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                aSwitch.setChecked(true);
                sh = getActivity().getSharedPreferences("darklight",Context.MODE_PRIVATE).edit();
                sh.putBoolean("is",true);
                sh.commit();
            }else{
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                sh = getActivity().getSharedPreferences("darklight",Context.MODE_PRIVATE).edit();
                sh.putBoolean("is",false);
                sh.commit();
            }
        }
    });
    

【问题讨论】:

  • 您不必重新启动应用程序,但您必须重新启动该活动和片段,并为用户提供无缝的流程,您必须正确保存和恢复状态。 reddit.com/r/androiddev/comments/9i8eo7/…
  • @NIKHILMAURYA 我想在更改模式时留在当前片段中。
  • 这就是保存当前状态部分的地方。基本上,您托管此片段的活动将被重新加载,此时您必须保存此信息,在重新加载完成后您将获取有关附加到它的片段的 savedInstanceState 数据并再次尝试设置。
  • 通过重新加载片段可以实现。您需要通过它的 OncreateView 才能在 setTheme 中提供新的更改。你可以通过stackoverflow.com/questions/20357557/…重新加载
  • 如果您在重新加载片段时遇到问题,那么简单的解决方案是重新启动包含该片段的活动,在 onCreate 调用此片段时,您需要使用标志(布尔值)来管理它,它的值在onCheckedChanged。

标签: android


【解决方案1】:

您可以使用 Android 中的 AppCompatDelegate 命令轻松完成此操作

将其设置为 False

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

将其设置为 True

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)

此外,您还可以使用切换按钮来应用修改和模式之间的切换。

【讨论】:

    【解决方案2】:

    让我们在设置片段中为夜间模式切换设置一个全局变量。然后,让我们在用户切换夜间模式时进行设置:

    var nightModeSwitched = false
    
    class SettingsFragment : Fragment() {
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
    
            nightModeButton.setOnClickListener {
                nightModeSwitched = true
                // Additional code to switch night mode on/off
            }
        }
    
    }
    

    您的父/导航活动将在 AppCompatDelegate.setDefaultNightMode 上的更改后重新加载。然后,当夜间模式切换时,让我们将用户从您的导航活动重定向到您的设置片段:

    class NavigationActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            if (nightModeSwitched) {
                loadFragment(SettingsFragment())
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多