我有一个加载 PreferenceFragment 的主要活动(它是 actionBar 的一部分)。
在 PreferenceFragment 中,我从 XML 文件加载我的首选项:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
问题是如果我更改选项卡(记住它是由 ActionBar 管理的),更改不同片段中的一个首选项并返回我的首选项片段,但它没有得到更新。特别是问题是 SwitchPreference(true/false) 可以从不同的片段甚至通过远程调用进行更改(然后共享首选项中的首选项正在更改。是的,我确实提交了更改)。
我搜索了不同的解决方案,但老实说,我没有找到一个可行的解决方案。我自己的想法如下:
如果我可以获得开关的 Switch 元素,我的问题将得到解决,因此我可以在 onStart() 或 onResume() 方法中将开关设置为 true。但是获取 Switch 对象有什么变化吗?如果我要加载通常的布局,我可以像这样访问开关:
View v = inflater.inflate(R.layout.start_fragment, container, false);
Switch status = (Switch) v.findViewById(R.id.switch1);
之后我就可以像这样设置开关的位置:
status.setChecked(true);
另一种解决方案是破坏实际视图并再次调用 addPreferencesFromResource() ,但老实说我不知道如何做到这一点......
第三种解决方案可能是在我的 PreferenceFragment 中使用 OnCheckedChangeListener,但问题再次是如何更改/更新开关。
我确信 Preference 已正确更新,因为我正在我的一项服务中运行 OnSharedPreferenceChangeListener 并调试此问题,我让监听器记录了我的 switchPreference 的状态。
你能以某种方式帮助我吗?
不幸的是,我无法在明天早上之前回答我自己的问题,所以我编辑了我的问题:
谢谢你们,我不想重新启动底层活动,而只想重新启动片段。
幸运的是,我在这个帖子中找到了一条线索:如何刷新 PreferenceActivity 以显示设置的更改?
我真的可以这么简单地访问 SwitchPreference。我的解决方案是:
private SwitchPreference pref_phone_locked;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
status = (SwitchPreference) findPreference("status");
}
public void onStart(){
super.onStart();
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
if(sharedPref.getBoolean("status", false)){
status.setChecked(true);
}else{
status.setChecked(false);
}
}
这样,我可以简单地将 Preference 转换为 SwitchPreference 并在每次 onStart() 调用后对其进行修改。我想这是解决我问题的最佳方法。
希望这个答案能在未来节省一些人的时间 =) 再次感谢你们!