Этот маленький трюк работает хорошо, я нашел много разных возможных решений этой проблемы, но только этот сработал для меня.

я естьPreferenceActivity с двухуровневым деревомPreferenceScreenс, что-то вроде:

<PreferenceScreen>
  <PreferenceScreen android:key="A">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  <PreferenceScreen android:key="B">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  ...
</PreferenceScreen>

Каждый из экранов предпочтения более низкого уровня, например, A и B, собирает две взаимосвязанные части данных. Я хочу, чтобы сводка для этих родительских элементов представляла собой комбинацию текущих значений двух вложенных предпочтений.

Я попытался добавить onPreferenceChangeListener в настройки листа и обновить сводку оттуда, но, похоже, это не сработало. Все предпочтения создаются программно в рамках действия, поэтому я делаю что-то вроде этого в onCreate:

   leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
       @Override
       public boolean onPreferenceChange(Preference preference, Object newValue) {
              // do some work
              prefScreenA.setSummary( /* get new summary based on newValue */);
              return true;
       }
  });

Затем я попытался найти место, где мне сообщили бы, что я вернулся на экран настроек верхнего уровня со страницы, чтобы я мог обновить на этом этапе. Однако я не совсем понимаю, как отображаются экраны нижнего уровня. Похоже, что это на самом деле диалоги, а не полные действия, так как onPause / onResume не вызывается при перемещении между ними. Есть где-то метод, который мне не хватает, который будет вызываться при возвращении на страницу верхнего уровня?

Я также попытался добавить sharedPreferenceChangeListener, как описаноВотно это никогда не кажется

У кого-нибудь есть намеки на то, что мне здесь не хватает, или какой-то более простой подход, который мне не хватает?

Ответы на вопрос(4)

У меня была такая же проблема, и кажется, что звонитActivity.onContentChanged () после изменения резюме исправлена ​​моя проблема.

@Override
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
  // Update summary value
  EditTextPreference pref = (EditTextPreference)findPreference(key);
  pref.setSummary(pref.getText());
  this.onContentChanged();
}
 Cheryl Simon06 апр. 2011 г., 03:34
Спасибо за предложение. Я перестал работать над этим некоторое время назад, но попробую, когда у меня будет шанс.
 Cheryl Simon07 апр. 2011 г., 23:36
К сожалению, это не сработало для меня.
 ToolmakerSteve18 сент. 2014 г., 03:21
Для всех, кто ищет, как обновить одно предпочтение при изменении другого, также см.stackoverflow.com/questions/7603633/....
 Yahia11 авг. 2013 г., 15:04
работал отлично, спасибо

наконец, нашел решение, используя значение, полученное от слушателя. В моем примере ниже (для ListPreference) я сначала получаю индекс значения в массиве ListPreference, затем я получаю метку значения, используя этот индекс:

passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            int newFrequency = Integer.valueOf(newValue.toString());

            prefs.edit().putInt("settings_key_password_frequency", newFrequency).commit();

            //get the index of the new value selected in the ListPreference array
            int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue));
            //get the label of the new value selected
            String label = (String) passwordFrequencyLP.getEntries()[index];

            passwordFrequencyLP.setSummary(label);

            makeToast(getResources().getString(R.string.password_frequency_saved));
            return true;
        }
    });

Этот маленький трюк работает хорошо, я нашел много разных возможных решений этой проблемы, но только этот сработал для меня.

Используйте следующий код и переопределите onContentChanged ()

   public class SettingsActivity extends PreferenceActivity
    {
         @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            setContentView(R.layout.settings_layout);


            }

@Override
    public void onContentChanged() {
        // put your code here
        super.onContentChanged();
    }

}

Надеюсь, это поможет.

т вдругой SO ответ, Вот волшебная линия:

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

Поместите это в ваш предпочтительный слушатель, тогда вы готовы.

Ваш ответ на вопрос