2011-01-11 11 views
7

mam PreferenceActivity z drzewa 2 poziomu PreferenceScreen s, coś jak:PreferenceActivity Podsumowanie Aktualizacja

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

Każdy z ekranów uprzywilejowanych niższy poziom, na przykład A i B, jest zbieranie dwóch powiązanych ze sobą danych . Chcę, by podsumowanie dla tych elementów nadrzędnych było kombinacją bieżących wartości dwóch sub-preferencji.

Próbowałem dodawać wartości onPreferenceChangeListener do preferencji liści i aktualizować stamtąd, ale wydaje się, że nie. wszystkie preferencje są tworzone programowo w ramach działalności, więc robię coś takiego w 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; 
     } 
    }); 

Potem starał się znaleźć miejsce, w którym mogę być poinformowany, że wróciłem do ekranu preferencji najwyższego poziomu z podstrony, abym mógł zaktualizować w tym momencie. Jestem jednak zdezorientowany, jak wyświetlane są ekrany niższego poziomu. Wygląda na to, że są to dialogi, a nie pełne działania, ponieważ onPause/onResume nie jest wywoływany podczas przechodzenia między nimi. Czy jest jakaś metoda, której mi brakuje, która zostanie wywołana po powrocie na stronę najwyższego poziomu?

Próbowałem również dodać sharedPreferenceChangeListener, zgodnie z opisem here, ale nigdy nie wydaje się, że zostanie wywołana.

Ktoś ma jakieś wskazówki na temat tego, czego tu brakuje, lub jakiejkolwiek łatwiejszej metody, której mi brakuje?

Odpowiedz

11

Miałem ten sam problem i wydaje mi się, że wywołanie Activity.onContentChanged() po zmianie podsumowania poprawiło mój problem.

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

Dzięki za sugestię. Przestałem pracować nad tym jakiś czas temu, ale spróbuję, kiedy dostanę szansę. –

+0

Niestety to nie działa dla mnie. –

+0

działał świetnie, dzięki – Yahia

0

Użyj następującego kodu i zastąpić 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(); 
    } 

} 

Nadzieję, że to pomaga.

0

Również stanąłem w obliczu tego problemu i w końcu znalazłem rozwiązanie, wykorzystując wartość pochodzącą od słuchacza. W moim przykładzie poniżej (na ListPreference), po raz pierwszy uzyskać indeks wartości w tablicy ListPreference, a następnie odzyskać etykietę wartości używając tego indeksu:

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; 
     } 
    }); 

Ten mały trick działa dobrze, znalazłem wiele różnych możliwych rozwiązań tego problemu, ale tylko ten zadziałał dla mnie.

0

Po naprawdę nieokreślonej ilości prób i błędów, w końcu znalazłem odpowiedź w another SO answer. Oto magiczna linia:

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

Połóż to w swoim ulubionym słuchaczu, wtedy dobrze jest iść.

Powiązane problemy