Preferencje Androida: Jak załadować wartości domyślne, gdy użytkownik nie korzystał z ekranu preferencji?


119

Używam PreferenceActivity, aby umożliwić użytkownikowi ustawienie niektórych wartości. Podaję mu plik xml ze zdefiniowanymi preferencjami.

Ustawiłem android:defaultValue=""dla nich wszystko.

Kiedy uruchamiam moją aplikację, potrzebuję preferencji lub jeśli nie są one jeszcze ustawione ręcznie, chcę wartości domyślne:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Jednak, kiedy android:defaultValue="true"nadal dostaję false. Tak więc wygląda na to, że domyślne wartości ustawione w XML nie są używane nigdzie, ale podczas inicjalizacji ekranu preferencji.

Nie chcę zakodować na stałe wartości domyślnych w getBoolean()metodzie. Czy jest więc sposób na uzyskanie wartości domyślnych, definiując je tylko w jednym miejscu?

Odpowiedzi:


169

to pytanie jest podobne do mojego:

zainicjuj-preferencje-z-xml-in-main-activity

Po prostu użyj tego kodu w onCreatemetodzie:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

Załaduje twoje preferencje z XML, a ostatni parametr ( readAgain) zagwarantuje, że preferencje użytkownika nie zostaną nadpisane. Oznacza to, że ustawienie readAgainargumentu na falseoznacza, że ​​spowoduje to ustawienie wartości domyślnych tylko wtedy, gdy ta metoda nigdy nie była wywoływana w przeszłości, więc nie musisz się martwić o nadpisywanie ustawień użytkownika za każdym razem, gdy tworzona jest Twoja aktywność

Zapoznaj się z PreferenceManager.setDefaultValues w Android API w celu dalszego zbadania.


Czy możemy użyć tego w stosunku do dowolnej innej zmiennej SharedPrefrence, którą tworzymy?
Amol Gupta,

8
Ponadto, jeśli aplikacja ma wiele punktów wejścia, należy umieścić go w onCreate()z Application.
SD,

2
To nie działa, jeśli używasz wartości logicznej i domyślnej wartości „false”, ponieważ wtedy domyślny wpis nie zostanie utworzony w systemie Android 2.x. Wywołanie „.getBoolean (KEY, true)” zawsze zwróci wartość true. Działa na Androidzie 4.x.
Gunnar Bernstein

10
Ustawienie wartości readAgaintrue nie ma nic wspólnego z nadpisywaniem preferencji użytkownika. Z Javadoc: Uwaga: NIE spowoduje to zresetowania preferencji do wartości domyślnych.
devconsole

1
Dla tych, którzy mają problemy z tym rozwiązaniem (nie działa, działa częściowo lub nie zawsze), zobacz odpowiedź Steve'a Waringa poniżej ( stackoverflow.com/a/25602205/4410376 ). Najprawdopodobniej masz kilka plików Shared-Prefs, np. Android tworzy kilka plików Shared-Prefs na podstawie Twojej konfiguracji lub niechlujnego kodu.
Hack06

27

Pamiętaj, że jeśli używasz
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

aby odzyskać preferencje, musisz użyć do ustawienia wartości domyślnych!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

Na przykład:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

Mam nadzieję, że to może komuś pomóc.


13

w zaakceptowanej odpowiedzi Pixela:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

stwierdza się, że falseoznacza to, że wartości domyślne nie zostaną nadpisane. To nie jest to, co robi, jest to tylko flaga wydajności, aby zatrzymać analizowanie, jeśli aplikacja ma więcej niż jeden punkt wejścia. Niestety, test nie jest wykonywany według pliku preferencji, więc jeśli masz więcej niż jeden plik preferencji, musisz zakodować truewszystkie z wyjątkiem pierwszego.

Jeśli martwisz się o wydajność, możesz zakodować coś takiego.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

Jeśli kiedykolwiek dodasz więcej wspólnych preferencji, po prostu ustaw SPL na wyższą liczbę.


2
Alternatywnie możesz zawsze utworzyć zbiorczy preferencje.xml, którego będziesz używać TYLKO do ustawiania wartości domyślnych. Na przykład, jeśli masz R.xml.prefs_device, R.xml.prefs_testi R.xml.prefs_admin. Można utworzyć jeden plik prefs który zawiera wszystkie prefs z powyższym: R.xml.prefs_for_loading_default_values. Następnie użyj które z PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo

Jeśli chodzi o wydajność: jeśli wywołasz to w onCreate()podklasie Application(zarejestrowanej w manifeście), zostanie ona wywołana tylko raz na uruchomienie aplikacji. Dla wydajności bardziej odpowiednie byłoby (jeśli w ogóle) nie wykonywać analizy za każdym razem, gdy aplikacja jest uruchamiana (zamiast tego tylko przy pierwszym uruchomieniu) i tak właśnie falsejest. Jest to więc bardziej kwestia tego, czy potrzebujesz sprawdzać przy każdym uruchomieniu (np. Kiedy mogą zostać dodane nowe preferencje), czy wystarczy zrobić to przy pierwszym uruchomieniu (lub zresetować preferencje).
user905686

2

Na przykład rozszerzenie DialogPreferencerobię to:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault może być:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • coś zindeksowanego w R.

Ok, jestem trochę zagubiony, jeśli chodzi o to, co próbujesz osiągnąć. Nie chcę wywoływać DialogPreference, potrzebuję wartości domyślnej, gdy użytkownik nie korzysta z Preferencji.
Peterdk,

Zamiast używać domyślnych preferencji w pliku prefs.xml, możesz tworzyć własne klasy. Na przykład możesz utworzyć nowy DialogPreference rozszerzający się z DialogPreference i nadpisać onSetInitialValue.
Macarse

0

Upewnij się również, że nigdy wcześniej nie korzystałeś z SharedPreferences. Aby upewnić się, że nie zostaną zmienione (co oznacza, że ​​setDefaultValues ​​(this, xml, false) nie ma żadnego efektu), odinstaluj swoją aplikację i prześlij ją ponownie, aby mieć pewność, że żadne wartości nie zostaną zmienione. To mi pomogło.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.