To musi pojawiać się bardzo często.
Gdy użytkownik edytuje preferencje w aplikacji na Androida, chciałbym, aby w Preference
podsumowaniu mógł zobaczyć aktualnie ustawioną wartość preferencji .
Przykład: jeśli mam ustawienie preferencji „Odrzuć stare wiadomości”, które określa liczbę dni, po których wiadomości muszą zostać wyczyszczone. W PreferenceActivity
chciałbym, aby użytkownik zobaczył:
„Odrzuć stare wiadomości” <- tytuł
„Wyczyść wiadomości po x dniach” <- podsumowanie, gdzie x jest bieżącą wartością preferencji
Dodatkowy kredyt: uczyń to wielokrotnego użytku, dzięki czemu mogę łatwo zastosować go do wszystkich moich preferencji niezależnie od ich typu (tak, aby działał z EditTextPreference, ListPreference itp. Przy minimalnym stopniu kodowania).
implements OnSharedPreferenceChangeListener
"%s"
naListPreference
iListPreference.getSummary()
sformatować podsumowanie z bieżącym wybranym wpisem (lub""
jeśli nie wybrano żadnego).Oto moje rozwiązanie ... FWIW
źródło
EditTextPreference
jestandroid:password="true"
ona pokazuje wartośćif editTextPref.getText() == ""
)? Jak uzyskać wartość podsumowania wupdatePrefSummary
?p.getSummary()
ieditTextPref.getSummary()
zwróć już zmodyfikowane wartości.PreferenceCategory
iPreferenceScreen
dziedziczą poPreferenceGroup
, zmieniłeminitSummary
na obsługęPreferenceGroup
zamiast. Pozwala to uniknąć konieczności kolejnej pętlionCreate()
. Zmiana zachowania: zagnieżdżone ekrany preferencji są teraz obsługiwane również rekurencyjnie.Dokumentacja Androida mówi, że można użyć znacznika formatowania ciągu w
getSummary()
:Po prostu określenie
android:summary="Clean up messages after %s days"
w deklaracji XML ListPreference działało dla mnie.Uwaga: Działa to tylko w przypadku
ListPreference
.źródło
android:defaultValue="0"
w pliku XML, podobnie jak w ListPreference. To najbardziej sensowna odpowiedź i działa dla mnie.defaultValue
i%s
nie działają. Jednak w innych wersjach ogólnie działa. Jakieś rozwiązanie proszę? Na pewno nie chcę do tego pisać niestandardowej klasy. Niewiarygodne, że Google sprawia, że najbardziej trywialne zadania są uciążliwe.Jeśli używasz
PreferenceFragment
, tak to rozwiązałem. To jest oczywiste.źródło
updatePreference
KODUif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
dzięki @EddieBunregisterOnSharedPreferenceChangeListener
?findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
PreferenceActivity.findPreference
(i kilku innych metod), ponieważ Google chce, abyś przeszedł na technikę pokazaną w tej odpowiedzi, która używaPreferenceFragment.findPreference
zamiast tego.Moja opcja to rozszerzenie ListPreference i to jest czyste:
Następnie dodajesz w pliku settings.xml:
źródło
init()
funkcja jest konieczna do aktualizacji,summary
kiedy użytkownik zmieni tę preferencję. Bez tego pozostanie bez względu na to, jaki był początkowo wpis.Możesz zastąpić domyślne klasy preferencji i zaimplementować tę funkcję.
Później możesz użyć własnych preferencji, takich jak
źródło
Po kilku godzinach spędzonych na rozwiązaniu takiego problemu zaimplementowałem ten kod:
[AKTUALIZACJA: ostateczna lista wersji]
To było jedyne rozwiązanie, które działało dla mnie dobrze. Zanim spróbowałem podklasować z ListPreferences i zaimplementować Androida: Summary = "bla bla bla% s". Żaden nie działał.
źródło
Może jak ListPreference: Zmodyfikuj getSummary, aby uzyskać to, czego chcesz:
I użyj tego w swoim xml:
Możesz więc napisać podsumowanie
%s
zamiast rzeczywistej wartości.źródło
android.support.v7.preference.EditTextPreference
nie powoduje to aktualizacji podsumowania po zmianie preferencji, tylko po utworzeniu działania preferencji. Aby obejść ten problem bez implementacjiOnSharedPreferenceChangeListener.onSharedPreferenceChanged
w klasie fragmentów preferencji, należy również przesłonićandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
To jest kod, którego potrzebujesz, aby ustawić podsumowanie na wybraną wartość. Ustawia także wartości przy uruchamianiu i przestrzega wartości domyślnych, nie tylko przy zmianie. Wystarczy zmienić „R.layout.prefs” na plik xml i rozszerzyć metodę setSummary na swoje potrzeby. W rzeczywistości obsługuje tylko ListPreferences, ale można łatwo dostosować do innych preferencji.
koem
źródło
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
poszczególnych Preferencji.W rzeczywistości CheckBoxPreference ma możliwość określenia innego podsumowania na podstawie wartości pola wyboru. Zobacz atrybuty android: summaryOff i android: summaryOn (a także odpowiednie metody CheckBoxPreference).
źródło
W przypadku EditTextPreference:
źródło
Jeśli ktoś nadal szuka odpowiedzi na to pytanie, powinieneś sprawdzić odpowiedź trzydziestego trzydziestego czwartego .
źródło
Dzięki za tę wskazówkę!
Mam jeden ekran preferencji i chcę pokazać wartość każdej preferencji listy jako podsumowanie.
Oto moja droga:
Działa to dla mnie, ale zastanawiam się, jakie jest najlepsze rozwiązanie (wydajność, stabilność, skalowalność): ten, który pokazuje Koem, czy ten?
źródło
Dzięki, Reto, za szczegółowe wyjaśnienie!
Na wypadek, gdyby komuś to pomogło, musiałem zmienić kod zaproponowany przez Reto Meiera, aby działał z SDK dla Androida 1.5
Ta sama zmiana dotyczy funkcji oddzwaniania
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Twoje zdrowie,
Chris
źródło
Rozwiązałem problem z następującym potomkiem ListPreference:
Wygląda na to, że działa mi dobrze w wersji od 1.6 do 4.0.4.
źródło
źródło
Widziałem, że wszystkie głosowane odpowiedzi pokazują, jak ustawić podsumowanie z dokładną bieżącą wartością, ale OP chciał również coś takiego:
Oto moja odpowiedź na osiągnięcie tego
Jak mówi dokumentacja na temat
ListPreference.getSummary()
:Próbowałem jednak na kilku urządzeniach i wydaje się, że to nie działa. Po przeprowadzeniu niektórych badań znalazłem dobre rozwiązanie w tej odpowiedzi . Po prostu polega na rozszerzeniu każdego
Preference
używanego i nadpisanegogetSummary()
do pracy zgodnie z dokumentacją Androida.źródło
Jeśli chcesz wyświetlać tylko zwykły tekst każdego pola jako jego podsumowanie, poniższy kod powinien być najłatwiejszy do utrzymania. Wymaga tylko dwóch zmian (wiersze 13 i 21, oznaczone „zmień tutaj”):
źródło
Oto moje rozwiązanie:
Zbuduj metodę „getter” typu preferencji.
Zbuduj metodę „setSummaryInit”.
Zainicjuj
Utwórz klasę publiczną, która PreferenceActivity i implementuje OnSharedPreferenceChangeListener
źródło
Po prostu:
źródło
FYI:
Tym bardziej patrzeć na bardzo gładkim
Answer
o @ASD powyżej ( źródło tutaj ) mówi w użyciu%s
wandroid:summary
dla każdego polapreferences.xml
. (Bieżąca wartość preferencji jest zastępowana%s
.)źródło
Ponieważ w klasie preferencji androidx ma interfejs SummaryProvider , można to zrobić bez OnSharedPreferenceChangeListener. Dostępne są proste implementacje dla EditTextPreference i ListPreference. Opierając się na odpowiedzi EddieB, może to wyglądać następująco. Testowane na androidx.preference: preferencja: 1.1.0-alpha03.
źródło
Tutaj wszystkie są wycięte z próbki Eclipse
SettingsActivity
. Muszę skopiować wszystkie te zbyt wiele kodów, aby pokazać, jak ci programiści Androida wybierają idealnie dla bardziej ogólnego i stabilnego stylu kodowania.Zostawiłem kody do dostosowania
PreferenceActivity
tabletu i lepszego API.xml/pref_general.xml
values/strings_activity_settings.xml
UWAGA: Właściwie chcę po prostu skomentować: „Próbka Google dla PreferenceActivity jest również interesująca”. Ale nie mam wystarczającej liczby punktów reputacji, więc proszę nie obwiniaj mnie.
(Przepraszam, za słaby angielski)
źródło
Musisz użyć funkcji bindPreferenceSummaryToValue w metodzie onCreate.
Przykład:
Zobacz lekcję 3 na kursie Udacity dla Androida: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
źródło
W przypadku EditTextPreference :
Doszedłem do tego rozwiązania, oczywiście, jeśli potrzebujesz konkretnej preferencji edytuj, ale możesz to zrobić z każdą Preferencją:
............
............
Następnie w onResume ();
W:
źródło
Moje rozwiązanie polega na utworzeniu niestandardowego
EditTextPreference
, używanego w XML w następujący sposób:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
źródło
Według dokumentów systemu Android można używać
app:useSimpleSummaryProvider="true"
w składnikach ListPreference i EditTextPreference.źródło
Aby ustawić podsumowanie a
ListPreference
na wartość wybraną w oknie dialogowym, możesz użyć tego kodu:i odwołaj się do
yourpackage.ListPreference
obiektu w twojejpreferences.xml
pamięci, aby określić tam swój,android:defaultValue
ponieważ spowoduje to wywołanieonSetInitialValue()
.Jeśli chcesz, możesz zmodyfikować tekst, zanim zadzwonisz
setSummary()
do dowolnej aplikacji.źródło
Ponieważ używam niestandardowego
PreferenceDataStore
, nie mogę dodać detektora do niektórych,SharedPreference
więc musiałem napisać nieco zhackowane rozwiązanie, które słucha każdej preferencji:źródło
Jeśli używasz AndroidaX, możesz użyć niestandardowego
SummaryProvider
. Takie podejście można zastosować do każdegoPreference
.Przykład z dokumentacji (Java):
Przykład z dokumentacji (Kotlin):
źródło