2013-09-29 39 views
0

我遇到問題了onSharedPreferenceChanged僅在第一次調用MultiSelectListPreference時發生更改。我打開我的設置活動並更改可以正常工作的值,並且onSharedPreferenceChanged正在調用。如果我再次打開對話框,它會顯示所選的正確條目。我選擇另一個條目並點擊確定。 onSharedPreferenceChanged現在應該被調用,但不是。如果我現在再次打開對話框,則不會選擇任何條目。我錯過了什麼,或者我做錯了什麼?onSharedPreferenceChanged不會在每次更改首選項時調用

這裏是我的preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <MultiSelectListPreference 
     android:key="operations" 
     android:title="@string/pref_operations" 
     android:dialogTitle="@string/pref_operations" 
     android:entries="@array/pref_operations_entries" 
     android:entryValues="@array/pref_operations_values" 
     android:defaultValue="@array/pref_operations_default" /> 
</PreferenceScreen> 

而且我的設置片段

public class SettingsFragment extends PreferenceFragment 
      implements SharedPreferences.OnSharedPreferenceChangeListener 
{  
    public static final String KEY_OPERATIONS_PREFERENCE = "operations"; 

    private MultiSelectListPreference operationsPreference; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     operationsPreference = (MultiSelectListPreference) getPreferenceScreen().findPreference(KEY_OPERATIONS_PREFERENCE);   
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

     Set<String> operations = operationsPreference.getValues(); 
     String summary = ""; 
     for (String s : operations) 
      summary += s + " "; 
     operationsPreference.setSummary(summary); 

     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 

     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     if (key.equals(KEY_OPERATIONS_PREFERENCE)) 
     {    
      Set<String> operations = operationsPreference.getValues(); 
      String summary = ""; 
      for (String s : operations) 
       summary += s + " "; 
      operationsPreference.setSummary(summary); 
     }   
    } 
} 

回答

0

烏姆坦白說,我建我的sharedPreferances不同......生病附上我的代碼示例,希望它會使用給你 這裏去:

這是共享首選類

public class AppPreferences { 
     public static final String KEY_LANG = "language"; 
     final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name 
                       // of 
                       // the 
                       // file 
                       // -.xml 
     private SharedPreferences _sharedPrefs; 
     private Editor _prefsEditor; 

     public AppPreferences(Context context) { 
      this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, 
        Activity.MODE_PRIVATE); 
      this._prefsEditor = _sharedPrefs.edit(); 
     } 

     public String getlanguage() { 
      return _sharedPrefs.getString(KEY_LANG, ""); 
     } 

     public void savelanguage(String text) { 
      _prefsEditor.putString(KEY_LANG, text); 
      _prefsEditor.commit(); 
     } 
    } 

使用它你會需要你的類

private AppPreferences _appPrefs; 

創造 和使用的示例是

_appPrefs = new AppPreferences(getApplicationContext()); 
      _appPrefs.savelanguage("English"); 
language = _appPrefs.getlanguage(); 

我這是怎麼建造它......就像一個魅力。 ..並不複雜

0

這是因爲您註銷了onPause回調方法中的監聽器,該方法在Activity中顯示Dialog時調用。

+0

我刪除了註銷電話,但它仍然不起作用。 – CubeX2

+0

您是否嘗試從一開始就在onSharedPreferenceChanged方法中設置一個斷點並檢查第一次被調用並且第二次未被調用? –

+0

我做到了。它被稱爲第一次,但不是第二次。其他首選項,例如列表首選項,如果以相同方式添加,似乎也可以正常工作。 – CubeX2

相關問題