2014-10-31 91 views
-1

我有一個PreferenceFragment有一個SwitchPreference。 Switch目前已打開,我想在onResume()中將其關閉(false)。然而,我注意到一個奇怪的結果:編寫偏好是假的後,我得到不同的結果使用findPreference(KEY)).isChecked())時使用sharedPreferences.getBoolean(KEY, defaultValue))sharedPreferences.getBoolean()和findPreference(KEY).isChecked()之間的區別是什麼

public class SettingsFragment extends PreferenceFragment { 
    private static final String KEY = "pref_enable"; 
    .... 

    @Override 
    public void onResume() { 
     super.onResume(); 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

     //Log the current value of SwitchPreferences, should be true 
     Log.d(TAG, "before by findPref: " + ((SwitchPreference) findPreference(KEY)).isChecked()); 
     Log.d(TAG, "before by sharedPref: " + sharedPreferences.getBoolean(KEY, true)); 

     sharedPreferences.edit().putBoolean(KEY, false).apply(); 

     //Log the value of SwitchPreferences after writing false, should be false 
     //this still prints true (WRONG) 
     Log.d(TAG, "after by findPref: " + ((SwitchPreference) findPreference(KEY)).isChecked()); 
     //this prints false (as expected) 
     Log.d(TAG, "after by sharedPref: " + sharedPreferences.getBoolean(KEY, true)); 
    } 
    .... 
} 

,輸出是:

before by findPref: true 
before by sharedPref: true 
after by findPref: true 
after by sharedPref: false 

然後我打開我的XML /data/data/packagename/shared_prefs文件夾中的設置進行檢查,結果現在是錯誤的(如預期的那樣)。從那以後,我按回到終止該應用,然後再次打開它,然後日誌現在預期(全是假的,因爲我們之前設定的開關爲false)

before by findPref: false 
before by sharedPref: false 
after by findPref: false 
after by sharedPref: false 

這意味着此聲明((SwitchPreference) findPreference(KEY)).isChecked()右後向Switch寫入錯誤會產生錯誤的結果。這是爲什麼?

回答

1
((SwitchPreference) findPreference(KEY)).isChecked() 

這表明是否勾選了複選框首選項(顯示在屏幕上)。它僅描述可用於進一步編程目的的複選框的狀態。


sharedPreferences.getBoolean(KEY, true) 

回報什麼是存儲在共享偏好給定鍵(或返回默認值,如果不可用)。無論您的偏好視圖如何,它都可以單獨使用,並用於存儲值。


然而,在一般情況下,你的偏好的意見都給予了keyid的這是因爲使用任何你改變它的狀態,它的值存儲在默認的共享偏好,當相同的值在即時更新XML。

+0

但假設我想讓首選項爲false並且以編程方式取消選中。我的理解是,我無法通過'sharedPreferences.edit()。putBoolean(KEY,false).apply();'來更新xml,並且希望取消選中視圖,但是應該使用'( SwitchPreference)findPreference(KEY))。setChecked(false);'然後我的xml文件會立即更新。是對的嗎? – 2014-10-31 05:59:15

+0

首選項直接連接到xml中的keyId。所以無論什麼時候發生變化,這個變化都會反映在xml中。事情是,你不應該通過手動覆蓋這個值而感到困惑。 – waqaslam 2014-10-31 13:42:23

+0

但我想要的是使首選項被取消選中,並以編程方式(不通過觸摸屏幕)錯誤。我已經通過'setChecked(false)'成功完成了,而這正是我想要的。我理解你的答案的前半部分,但是從「另外,原因...」開始的部分並不回答我的問題,因爲將它設置爲編程錯誤是我想要的,這並不是因爲我感到困惑。所以我認爲你應該刪除那部分,我會將你的答案標記爲我的答案。 – 2014-11-01 11:30:08

0

apply is asynchronous

如果您使用PreferenceFragment,則無需您自己保存價值。
我認爲它會被框架自動處理。

相關問題