在明暗模式之间切换后,有没有办法保留变量状态的值以在文本视图中显示

is there way to preserve the value of variable state to show in textview after switching between light and dark modes

我是新手,我正在尝试构建计算按钮被点击次数的应用程序 我有一个名为 count 的变量,它记录按钮被点击的次数,并在按钮下方的文本视图中显示,我有暗模式切换按钮来在暗模式和亮模式之间切换。 最初在亮模式下我点击了几次按钮然后它显示了按钮点击次数的计数,然后我切换到暗模式计数已设置为零 在亮模式和暗模式之间切换后,有什么方法可以保留变量状态的值以在 textview 中显示? 当我点击暗模式或亮模式时,计数值重置为 0,但我想要先前处于亮模式的值...

这是我的代码

public class MainActivity extends AppCompatActivity {

Button button;
TextView textView1,textView2;
Switch aSwitch;
int count=0;
String light="light",dark="dark";

RelativeLayout relativeLayout;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = findViewById(R.id.button);
    textView1 = findViewById(R.id.remindmetext);
    textView2 = findViewById(R.id.countext);
    aSwitch = findViewById(R.id.switch1);
    relativeLayout = findViewById(R.id.relative);

    SharedPreferences sharedPreferences
            = getSharedPreferences(
            "sharedPrefs", MODE_PRIVATE);
    final SharedPreferences.Editor editor
            = sharedPreferences.edit();
    final boolean isDarkModeOn
            = sharedPreferences
            .getBoolean(
                    "isDarkModeOn", false);

    if (isDarkModeOn) {
        AppCompatDelegate
                .setDefaultNightMode(
                        AppCompatDelegate
                                .MODE_NIGHT_YES);
        aSwitch.setText(
                "Light");
    }
    else {
        AppCompatDelegate
                .setDefaultNightMode(
                        AppCompatDelegate
                                .MODE_NIGHT_NO);
        aSwitch
                .setText(
                        "Dark");
    }

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            count=count+1;
            textView2.setText(Integer.toString(count));
        }
    });

    aSwitch.setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View view)
                {
                    // When user taps the enable/disable
                    // dark mode button
                    if (isDarkModeOn) {

                        // if dark mode is on it
                        // will turn it off
                        AppCompatDelegate
                                .setDefaultNightMode(
                                        AppCompatDelegate
                                                .MODE_NIGHT_NO);
                        // it will set isDarkModeOn
                        // boolean to false
                        editor.putBoolean(
                                "isDarkModeOn", false);
                        editor.apply();

                        // change text of Button
                        aSwitch.setText(
                                "Dark");
                    }
                    else {

                        // if dark mode is off
                        // it will turn it on
                        AppCompatDelegate
                                .setDefaultNightMode(
                                        AppCompatDelegate
                                                .MODE_NIGHT_YES);

                        // it will set isDarkModeOn
                        // boolean to true
                        editor.putBoolean(
                                "isDarkModeOn", true);
                        editor.apply();

                        // change text of Button
                        aSwitch.setText(
                                "Light");
                    }
                }
            });

}

}

这是gif

当您更改主题时,将重新创建所有活动和片段。参见 Configuration Changes。您可以:

  • 在 ViewModel 中保存计数值
  • 将计数值保存在 savedInstanceState 包中
  • 在 SharedPreferences 中保存您的计数值

并相应地从它们加载。对于这种简单的情况,使用 savedInstanceState 并不麻烦,因为它确保在第一次创建时为空值,并在配置更改时确保为非空值。使用 SharedPreferences 也很容易。