2016-12-30 97 views
1

我再次發佈這個問題,因爲我上次沒有得到任何答案,我仍然沒有解決問題。Android:SharedPreferences沒有從PreferenceFragment更新

我有一個PreferenceScreen設置菜單,其中我在運行時創建了很多CheckBoxPreferences(將它們添加到「排除列表」預覽屏幕中)。我創造了他們沒有問題的,這裏的XML代碼下面,它的開頭爲:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceScreen 
     android:key="exclusion_list_key" 
     android:title="Exclusion List" 
     android:persistent="true" 
     android:summary="" > 
    </PreferenceScreen> 
</PreferenceScreen> 

我在PreferenceFragment的onCreate方法創建的複選框,將其添加到「排除列表」 PreferenceScreen和工作正常。

我試圖將「排除列表」的摘要設置爲所有勾選的複選框標題的列表(因此,如果複選框被選中,它的名稱將被列在「排除列表「)。

在onCreate()方法中,摘要被正確設置,沒有問題。

但是在onPreferenceChanged()方法中,我將「排除列表」的摘要設置爲我創建的「摘要」字符串(它包含正確的值),但不會更新它!當我從複選框菜單中按回時,「排除列表」沒有更新的值。

最後幾行是感興趣的。我做了一些printlns,看看發生了什麼事情:

  1. 監聽器工作正常,當預期

  2. 我總結變種中包含什麼的預期

  3. 調用setSummary(摘要)運行後,將getSummary ()返回期望值(所以這意味着它設置正確)

  4. 但是,當我實際上按回來看到「排除列表」,它的總結實際上並沒有得到更新!

我錯過了什麼嗎?提前致謝!

參考的所有代碼:

public class Settings extends AppCompatActivity { 

    public static final String EXC_LIST_KEY = "exclusion_list_key"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
    } 

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.preferences); 
      String summary = ""; 

      //Create all the checkboxes inside of the PreferenceScreen 
      for (int i = 0; i < MainActivity.contactNames.length; i++) { 
       CheckBoxPreference checkbox = new CheckBoxPreference(getActivity()); 
       checkbox.setTitle(MainActivity.contactNames[i][0]); 
       checkbox.setKey(MainActivity.contactNames[i][2]); 
       checkbox.setSummary(MainActivity.contactNames[i][1]); 
       checkbox.setDefaultValue(false); 
       ((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox); 
       if (checkbox.isChecked()) { 
        summary = summary + checkbox.getTitle() + "\n"; 
       } 
      } 
      findPreference(EXC_LIST_KEY).setSummary(summary); 
      getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
     } 

     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
      //Checkbox keys all start with 'key_' 
      if (key.startsWith("key_")) { 
       String summary = ""; 
       for (int i = 0; i < MainActivity.contactNames.length; i++) { 
        CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]); 
        if (checkbox.isChecked()) { 
         summary = summary + checkbox.getTitle() + "\n"; 
        } 
       } 
       System.out.println("Summary I have: " + summary); //Correct summary is printed out 
       findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value??? 
       System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out 
      } 
     } 
    } 
} 

回答

0

得到它的工作通過添加以下代碼行到我的onSharedPreferenceChanged結束()方法:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 
0

嘗試添加該代碼在你SettingsFragment

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

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 

    // CHANGE 1: load saved values to set the summaries 
    onSharedPreferenceChanged(prefs, "exclusion_list_key"); 

    // CHANGE 2: register shared prefs listener in onResume 
    prefs.registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
} 
+0

這沒有奏效 – user1429039