如何获取EditTextPreference中的链接并更新SharedPreferences存储的链接?
问题根因
- 系统
EditTextPreference组件默认会将用户输入的值写入Android系统默认的DefaultSharedPreferences存储区,而你自定义工具类中单独创建了以R.string.key命名的独立SharedPreferences文件,两处存储位置完全隔离,所以读取自定义文件自然拿不到EditTextPreference更新后的值 - 你混淆了SharedPreferences文件名和存储键的概念,初始化SharedPreferences时将
R.string.key作为文件名,后续存取数据时又将同一个值作为存储键,极易出现逻辑错误 - 全局复用
SharedPreferences.Editor实例存在隐患,Editor为单次操作对象,每次修改数据都应该重新获取实例,否则容易出现提交失败的问题
修复方案
方案1:使用默认SharedPreferences存储(推荐,适配原生Preference组件逻辑)
- 替换工具类中SharedPreferences初始化逻辑:
// 替换原有自定义SharedPreferences初始化代码 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
- 优化存取逻辑,避免复用Editor实例:
public String getfeed() { return preferences.getString(getString(R.string.key), ""); } public void setfeed(String rssfeed) { // 每次修改都重新获取Editor实例 SharedPreferences.Editor edit = preferences.edit(); edit.putString(getString(R.string.key), rssfeed); edit.apply(); // apply为异步提交,主线程调用不会阻塞UI,比commit更适合此处场景 }
修改完成后即可正常读取到EditTextPreference中存储的最新值。
方案2:保留自定义SharedPreferences文件
如果确实需要用自定义名称的SharedPreferences文件存储Preference数据,需要在preferences.xml的根PreferenceScreen节点新增存储文件名配置:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:sharedPreferencesName="@string/your_custom_sp_file_name"> <!-- 原有EditTextPreference配置保持不变 --> <EditTextPreference android:key="@string/key" android:title="@string/title_preferences" android:summary="@string/sub_title_preferences" android:dialogTitle="@string/popup_preferences" /> </PreferenceScreen>
注意your_custom_sp_file_name对应的值不要和存储键R.string.key重复,避免混淆,之后工具类中初始化SharedPreferences时传入该文件名即可。
内容的提问来源于stack exchange,提问作者Diogo Santos
相关产品推荐
相关产品推荐

