应用深色主题后如何停留在当前Setting Fragment?
解决主题切换后Fragment回到首页的问题
问题出在Activity重建时,你没有读取之前保存的last_fragment_tag并恢复对应的Fragment,而是默认加载了Home Fragment,导致导航栏选中状态和实际显示的Fragment不一致。
修复步骤:
1. 确保添加Fragment时指定唯一Tag
在Activity的Fragment切换逻辑里,给每个Fragment设置对应的唯一Tag,示例代码如下:
// 切换到Setting Fragment getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, new SettingFragment(), "setting_fragment") .commit(); // 切换到Home Fragment getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, new HomeFragment(), "home_fragment") .commit(); // 其他Fragment的切换同理,都要设置对应Tag
2. 在Activity重建时恢复最后显示的Fragment
在Activity的onCreate方法中,读取SharedPreferences里保存的last_fragment_tag,并加载对应的Fragment:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先应用主题设置 SharedPreferences preferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); boolean isNightMode = preferences.getBoolean(KEY_THEME, false); AppCompatDelegate.setDefaultNightMode(isNightMode ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); // 恢复最后显示的Fragment(仅在首次创建或重建时执行) if (savedInstanceState == null) { String lastFragmentTag = preferences.getString("last_fragment_tag", "home_fragment"); Fragment targetFragment = null; switch (lastFragmentTag) { case "setting_fragment": targetFragment = new SettingFragment(); break; case "home_fragment": targetFragment = new HomeFragment(); break; // 补充其他Fragment的判断逻辑 case "profile_fragment": targetFragment = new ProfileFragment(); break; case "message_fragment": targetFragment = new MessageFragment(); break; } if (targetFragment != null) { getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, targetFragment, lastFragmentTag) .commit(); } } }
3. 确认SettingFragment的保存逻辑有效性
你当前代码中保存Fragment Tag的逻辑没问题,但要确保添加Fragment时设置的Tag不为空,否则currentFragment.getTag()会返回null,导致无法正确保存。
这样修改后,当Activity因主题切换重建时,会自动加载之前保存的Fragment,保持导航栏选中状态和实际显示内容一致。
内容的提问来源于stack exchange,提问作者Rinchen
相关产品推荐
相关产品推荐

