Jak uzyskać SharedPreferences z Preferencectivity w Androidzie?

Używam PreferenceActivity, aby pokazać niektóre ustawienia dla mojej aplikacji. Nadmuchuję Ustawienia za pomocą pliku xml, aby moje onCreate (i pełne metody klasowe) wyglądały tak:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

The javadoc of PreferenceFragment stwierdza, że

Te preferencje będą automatycznie zapisywane na SharedPreferences w miarę interakcji użytkownika z nimi. Aby pobrać instancję SharedPreferences, że hierarchia preferencji w tym activity will use, call getDefaultSharedPreferences (android.treść.Context) z kontekstem w tym samym pakiecie co ta aktywność.

Ale jak uzyskać nazwę SharedPreference w innej aktywności? I can only call

getSharedPreferences(name, mode)

W innej aktywności, ale potrzebuję nazwy SharedPreference, która była używana przez PreferenceActivity. Jak się nazywa i jak mogę go odzyskać?

Author: Ziem, 2010-04-10

5 answers

import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

Update

W 2013 roku, w ramach projektu "Android Developer Tutorial", stworzonego przez Sai Geetha m n., stworzonego przez Sai Geetha m n., stworzonego przez Sai Geetha m n., stworzonego przez Sai Geetha m n., stworzonego przez Sai Geetha m n.]}

Wiele aplikacji może zapewnić sposób przechwytywania preferencji użytkownika na ustawienia konkretnej aplikacji lub działania. Za wsparcie to Android zapewnia prosty zestaw interfejsów API.

Preferencje są zazwyczaj parami wartości nazw. Mogą być przechowywane jako "Wspólne preferencje" w różnych działaniach w zastosowanie (Uwaga obecnie nie może być współdzielony między procesami). Albo może być coś, co musi być przechowywane specyficznie dla danej aktywności.

  1. Wspólne Preferencje: wspólne preferencje mogą być używane przez wszystkie komponenty (działania, usługi itp.) aplikacji.

  2. Preferencje obsługi aktywności: te preferencje mogą być używane tylko w ramach danej aktywności i nie mogą być używane przez inne komponenty podanie.

Wspólne Preferencje:

Współdzielone preferencje są zarządzane za pomocą metody getSharedPreferences klasy Context. Preferencje są przechowywane w domyślnym pliku (1) możesz też podać nazwę pliku (2) do wykorzystania w odniesieniu do preferencji.

(1) zalecanym sposobem jest użycie trybu domyślnego, bez podawania nazwy pliku

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Oto jak uzyskać instancję, gdy podaj nazwę pliku

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATE jest trybem pracy dla preferencji. Jest to tryb domyślny i oznacza, że wytworzony plik będzie dostępny tylko przez wywołującą aplikację. Pozostałe dwa Obsługiwane tryby to MODE_WORLD_READABLE i MODE_WORLD_WRITEABLE. W MODE_WORLD_READABLE inna aplikacja może odczytać utworzony plik, ale nie może go modyfikować. W przypadku MODE_WORLD_WRITEABLE inne aplikacje również mają uprawnienia do zapisu dla utworzonego pliku.

Wreszcie, gdy masz instancję preferencji, oto jak możesz pobieranie zapisanych wartości z preferencji:

int storedPreference = preferences.getInt("storedInt", 0);

Do należy zapisać wartości w pliku preferencji SharedPreference.Editor. Editor jest zagnieżdżonym interfejsem w klasie SharedPreference.

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Edytor obsługuje również metody takie jak remove() i clear() do usuwania wartości preferencji z pliku.

Preferencje Aktywności:

Wspólne preferencje mogą być używane przez inne składniki aplikacji. Ale jeśli nie musisz dzielić się preferencje z innymi komponentami i chcesz mieć prywatne preferencje aktywności możesz to zrobić za pomocą metody getPreferences() aktywności. Metoda getPreference używa metody getSharedPreferences() z nazwą klasy activity dla nazwy pliku preferencji.

Poniżej znajduje się kod, aby uzyskać preferencje

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

Kod do przechowywania wartości jest również taki sam jak w przypadku współdzielonych preferencji.

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

Możesz również użyć innych metod, takich jak przechowywanie stanu aktywności w bazie danych. Uwaga Android zawiera również pakiet o nazwie android.preference. Pakiet definiuje klasy do implementacji UI preferencji aplikacji.

Aby zobaczyć więcej przykładów, sprawdź post Androida Data Storage na stronie deweloperów.

 692
Author: Pentium10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 16:48:15

Jeśli nie masz dostępu do getDefaultSharedPreferenes(), możesz użyć getSharedPreferences(name, mode) zamiast tego, wystarczy podać odpowiednią nazwę.

Android tworzy tę nazwę (prawdopodobnie na podstawie nazwy pakietu twojego projektu?). Można go uzyskać, umieszczając następujący kod w SettingsActivity onCreate(), i zobaczyć, czym jest preferencesName.

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

Łańcuch powinien być podobny do com.example.projectname_preferences. Zakoduj to gdzieś w swoim projekcie i przekaż do getSharedPreferences() i powinieneś być gotowy.

 29
Author: Green Oak Software,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-27 18:06:36

Najpierw Zadeklaruj te metody..

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

Następnie zadzwoń, gdy chcesz umieścić pref:

putPref("myKey", "mystring", getApplicationContext());

Zadzwoń, gdy chcesz uzyskać pref:

getPref("myKey", getApplicationContext());

Lub możesz użyć tego obiektu https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo co upraszcza wszystko jeszcze bardziej

Przykład:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);
 20
Author: kc ochibili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-25 19:45:05

Irytuje mnie konieczność przekazywania kontekstu wszędzie. kod staje się zbyt gadatliwy i niemożliwy do zarządzania. Robię to w każdym projekcie...

public class global {
    public static Activity globalContext = null;

I ustaw go w głównym ćwiczeniu create

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

Również wszystkie klawisze preferencji powinny być niezależne od języka, jestem w szoku, że nikt o tym nie wspomniał.

getText(R.string.yourPrefKeyName).toString()

Teraz nazwij to po prostu tak w jednej linijce kodu

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
 3
Author: hamish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-18 04:20:52

Jeśli masz pole wyboru i chcesz pobrać jego wartość IE true / false w dowolnym pliku java--

Użyj--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
 2
Author: UrviG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 17:48:44