2016-12-30 11 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> 

Я создаю флажков в OnCreate метод моего PreferenceFragment и добавить их в «Список исключений» PreferenceScreen и работает отлично.

Я пытаюсь установить сводку «Список исключений» как список всех отмеченных флажков, поэтому если флажок установлен, это имя будет указано в сводке " Список исключений").

В методе onCreate() сводка устанавливается правильно, нет проблем.

Но в методе onPreferenceChanged() я устанавливаю сводку «списка исключений» в строку «summary», которую я построил (которая содержит правильное значение), но она не обновляет ее! Когда я вернусь из своего меню флажка, «Список исключений» не имеет обновленных значений.

Последние несколько строк являются интересными. Я сделал несколько 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

 Смежные вопросы

  • Нет связанных вопросов^_^