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
相关产品推荐
相关产品推荐

