【问题标题】:Changes are not applied to all the activities更改不适用于所有活动
【发布时间】:2019-06-10 09:32:59
【问题描述】:

我在我的应用中实现了夜间模式。用户可以在个人资料活动中更改夜间模式设置。活动顺序如下。

TabbedActivity>>DisplayActivity,ProfileActivity

更改的设置仅应用于当前活动。(即个人资料活动)。如果用户按下后退按钮,则更改不会应用于该活动。任何人都可以帮助我将更改应用于所有活动。当我们关闭应用程序时并再次打开。更改已应用。但后按不起作用。

这是我正在使用的代码。

 @Override
protected void onCreate(Bundle savedInstanceState) {
    final SharedPreferences sharedPreferences = 
getSharedPreferences("NIGHT_MODE", MODE_PRIVATE);
    int result=sharedPreferences.getInt("NIGHT_MODE_OPTION",0);

    if (result==2){
        setTheme(R.style.darkTheme);
    }else setTheme(R.style.AppTheme);
    loadLocale();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);
final SharedPreferences.Editor editor = getSharedPreferences("NIGHT_MODE", MODE_PRIVATE).edit();



    if (result==2){
        night.setChecked(true);
    }
    night.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked){
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_YES);
                editor.apply();
                startActivity(getIntent());
            }else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_NO);
                editor.apply();
               startActivity(getIntent());

            }
        }
    });

}

【问题讨论】:

    标签: android android-activity taskstackbuilder android-night-mode


    【解决方案1】:

    因为您考虑 Android 生命周期。您可以在onCreate 中配置所有内容。但是,在活动之间切换时,当前活动的生命周期会相应改变。 Here 生命周期解释得很好

    解决方案:

    当您返回上一个活动时,会调用 onResume。您应该在此方法中应用所有更改

    override fun onResume() {
       super.onResume()
    
       //Read your settings from SharedPrefs then apply, here
    }
    

    【讨论】:

    • 那么,不需要在 onCreate 中应用更改了吗?
    • 是的,因为这个方法是有争议的,所以总是被调用
    【解决方案2】:

    '我认为更好的做法是在每次更改主题时重新启动/重置应用程序'

    Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( 
    getBaseContext().getPackageName() );
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    startActivity(i); finish(); 
    

    【讨论】:

    • 你能解释一下代码的第一行吗。我不明白。什么是 MyApp 和 A。我的意思是我应该写什么。我正在更新个人资料活动
    • 我应用了你的代码。但是当我按下返回按钮时。没有应用更改。如果我关闭并再次打开应用程序,则应用更改
    • 意图 i = getBaseContext().getPackageManager() .getLaunchIntentForPackage( getBaseContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);开始活动(一);结束();试试这个
    • 我需要编写此代码,我在哪个活动中进行更改?
    • 你需要在你改变主题的clicklistener中写下这段代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多