我有一个主要活动加载PreferenceFragment(它是actionBar的一部分)。
在PreferenceFragment中,我从XML文件中加载我的首选项:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
问题是如果我更改Tab(记住它是由ActionBar管理),更改其他片段中的一个首选项并返回到我的preferenceFragment它没有得到更新。特别是问题是SwitchPreference(true / false),可以从不同的片段甚至通过远程调用进行更改(然后在共享首选项中更改首选项。是的,我确实提交了更改)。
我搜索了不同的解决方案,但说实话,我找不到合适的解决方案。 我自己的想法如下:
如果我能得到交换机的Switch Element,我的问题就解决了,所以我可以在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的状态。
你能以某种方式帮助我吗?
不幸的是,我明天早上才能回答我自己的问题,所以我编辑了我的问题:
谢谢大家,我不想重新启动基础活动,只想重启片段。
幸运的是,我在这个主题中发现了一个线索:How do you refresh PreferenceActivity to show changes in the settings?
我真的可以轻松访问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()调用后修改它。我想这是我问题的最佳解决方案。
希望这个答案能在将来节省一些时间=) 再次感谢你们!
答案 0 :(得分:0)
我不确定这是否对您有用(我对Android有一个非常基本的知识)但我在类似的问题中找到了这个解决方案,它对我很有用
private void simulateRefresh(){
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
基本上,这会在没有动画的情况下破坏并重新创建活动。
找到here