You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用深色主题后如何停留在当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:12:46