如何实现仅点击Switch时重启App?当前切换Fragment即触发重启
问题根源
你遇到的问题是:调用nsfwSetting.setChecked(...)时会自动触发OnCheckedChangeListener的onCheckedChanged回调,导致Fragment刚加载就执行了重启逻辑,而非仅在用户点击Switch时触发。
解决方案
以下两种方式都能实现「仅用户点击Switch时才重启App」的需求:
方案一:调整代码顺序(推荐,最简单)
先设置Switch的选中状态,再绑定监听器。这样代码设置选中状态时,监听器还未绑定,不会触发重启逻辑,只有用户点击Switch时才会触发回调。
// 先从SharedPreferences读取状态,设置Switch的选中状态 nsfwSetting.setChecked(mSharedPrefs_nsfw_settings.getBoolean(REWARD_GRANTED_KEY, false)); // 再绑定选中状态变化监听器 nsfwSetting.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 保存新状态到SharedPreferences SharedPreferences.Editor editor = mSharedPrefs_nsfw_settings.edit(); editor.putBoolean(REWARD_GRANTED_KEY, isChecked); editor.apply(); // 重启App restartMainActivity(); } }); private void restartMainActivity() { Intent intent = new Intent(requireActivity(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); requireActivity().finish(); }
方案二:用标志位区分触发来源
如果你的业务逻辑需要先绑定监听器再设置状态,可以添加一个布尔标志位,区分「代码触发的状态变更」和「用户点击触发的状态变更」,仅在用户点击时执行重启。
private boolean isProgrammaticChange = false; // 先绑定监听器 nsfwSetting.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isProgrammaticChange) { // 代码触发的变更,跳过重启逻辑 isProgrammaticChange = false; return; } // 保存新状态到SharedPreferences SharedPreferences.Editor editor = mSharedPrefs_nsfw_settings.edit(); editor.putBoolean(REWARD_GRANTED_KEY, isChecked); editor.apply(); // 重启App restartMainActivity(); } }); // 设置选中状态前,标记为代码触发 isProgrammaticChange = true; nsfwSetting.setChecked(mSharedPrefs_nsfw_settings.getBoolean(REWARD_GRANTED_KEY, false)); private void restartMainActivity() { Intent intent = new Intent(requireActivity(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); requireActivity().finish(); }
内容的提问来源于stack exchange,提问作者Vasant Raval
相关产品推荐
相关产品推荐

