![](/img/trans.png)
[英]Android: SharedPreferences not getting updated from PreferenceFragment
[英]Preference in PreferenceFragment is not getting updated
我有一個主要的活動,該活動會加載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進行管理),更改了另一個片段中的首選項之一,並返回到我的preferenceFragment中,它沒有被更新。 尤其是問題是可以從不同片段甚至通過遠程調用更改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,但是問題仍然是如何更改/更新開關。
我確信首選項已正確更新,因為我正在其中一項服務中運行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()調用之后對其進行修改。 我想這是解決我問題的最好方法。
希望這個答案將來可以節省別人的時間=)再次謝謝你們!
我不確定這是否適合您(我有非常基礎的Android知識),但是我在類似的問題中找到了該解決方案,對我來說效果很好
private void simulateRefresh(){
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
基本上,這會破壞並重新創建活動,而中間沒有動畫。
在這里找到
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.