2011-01-11 2 views
7

У меня есть PreferenceActivity с деревом 2 уровня PreferenceScreen с, что-то вроде:PreferenceActivity резюме обновление

<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, как описано here, но это никогда не называется.

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

ответ

11

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

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    // Update summary value 
    EditTextPreference pref = (EditTextPreference)findPreference(key); 
    pref.setSummary(pref.getText()); 
    this.onContentChanged(); 
} 
+0

Спасибо за предложение. Я перестал работать над этим некоторое время назад, но я попробую, когда у меня появится шанс. –

+0

К сожалению, это не сработало для меня. –

+0

работал отлично, спасибо – Yahia

0

Используйте следующий код и переопределить 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(); 
    } 

} 

Надеется, что это помогает.

0

Я также столкнулся с этой проблемой, и, наконец, я нашел решение, используя значение, исходящее от слушателя. В моем примере ниже (для 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; 
     } 
    }); 

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

0

После действительно сумасшедшего количества проб и ошибок, я наконец нашел ответ в another SO answer. Вот волшебная линия:

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

Положите это в свой приемник предпочтений, тогда вам хорошо идти.

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