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

Android代码手动设置的SharedPreferences未在SettingsActivity加载怎么解决

问题根源

你读写的是两个完全独立的SharedPreferences实例:

  • MainActivity中调用this.getPreferences(Context.MODE_PRIVATE)获取的是当前Activity私有的SP实例,存储文件以Activity类名命名,仅该Activity可访问
  • PreferenceFragmentCompat默认读取的是应用全局的默认SharedPreferences,对应PreferenceManager.getDefaultSharedPreferences(Context)返回的实例,存储文件以你的应用包名为后缀命名

两者存储位置完全隔离,所以配置页面读不到你在MainActivity里存的值。

解决方案

方案1(推荐):统一使用应用默认SP

修改MainActivity中initPreferences方法的SP获取逻辑:

// 替换原来的 this.getPreferences(Context.MODE_PRIVATE)
SharedPreferences sharedPref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this);

修改后两边读写的是同一份SP数据,配置页面会自动加载已存的配置值。

方案2:指定偏好页使用自定义SP

如果你需要使用自定义命名的SP文件,可在SettingsFragment的onCreatePreferences方法中显式指定SP文件信息:

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    // 先指定SP文件名和模式
    getPreferenceManager().setSharedPreferencesName("你的自定义SP文件名");
    getPreferenceManager().setSharedPreferencesMode(Context.MODE_PRIVATE);
    // 再加载偏好配置
    setPreferencesFromResource(R.xml.root_preferences, rootKey);
}

同时要保证MainActivity中初始化SP时用同样的文件名和模式获取实例:

SharedPreferences sharedPref = getSharedPreferences("你的自定义SP文件名", Context.MODE_PRIVATE);

修改完成后重新运行即可看到配置页已正确加载默认值。


内容的提问来源于stack exchange,提问作者slhck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:54:00