Jak uzyskać SharedPreferences z PreferenceActivity w Androidzie?

373

Korzystam z PreferenceActivity, aby wyświetlić niektóre ustawienia mojej aplikacji. Pompuję ustawienia za pomocą pliku xml, dzięki czemu mój onCreate (i kompletne metody klasowe) wygląda następująco:

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

W javadoc PreferenceActivity PreferenceFragment stwierdza się, że

Te preferencje zostaną automatycznie zapisane w SharedPreferences, gdy użytkownik będzie z nimi współdziałał. Aby pobrać instancję SharedPreferences, z której skorzysta hierarchia preferencji w tym działaniu, wywołaj getDefaultSharedPreferences (android.content.Context) z kontekstem w tym samym pakiecie co to działanie.

Ale jak uzyskać nazwę SharedPreference w innym działaniu? Mogę tylko zadzwonić

getSharedPreferences(name, mode)

w drugiej działalności, ale potrzebuję nazwy SharedPreference, która była używana przez PreferenceActivity. Jaka jest nazwa lub jak mogę ją odzyskać?

Dave
źródło

Odpowiedzi:

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

Aktualizacja

Zgodnie ze wspólnymi preferencjami | Samouczek programisty Androida (część 13) autorstwa Sai Geetha MN,

Wiele aplikacji może stanowić sposób na uchwycenie preferencji użytkownika dotyczących ustawień konkretnej aplikacji lub działania. Do obsługi tego systemu Android zapewnia prosty zestaw interfejsów API.

Preferencje to zazwyczaj pary wartości nazw. Mogą być przechowywane jako „Preferencje współdzielone” dla różnych działań w aplikacji (zauważ, że obecnie nie można ich współdzielić między procesami). Lub może to być coś, co należy przechowywać specyficzne dla działania.

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

  2. Preferencje obsługiwane przez działanie: Preferencje te mogą być używane tylko w ramach określonego działania i nie mogą być używane przez inne komponenty aplikacji.

Wspólne preferencje:

Wspólnymi preferencjami zarządza się za pomocą getSharedPreferencesmetody Contextklasy. Preferencje są przechowywane w domyślnym pliku (1) lub można określić nazwę pliku (2), która będzie używana w odniesieniu do preferencji.

(1) Zalecanym sposobem jest korzystanie z trybu domyślnego bez podawania nazwy pliku

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Oto jak uzyskać instancję, gdy określasz nazwę pliku

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

MODE_PRIVATEto tryb działania preferencji. Jest to tryb domyślny i oznacza, że ​​dostęp do utworzonego pliku będzie mieć tylko aplikacja wywołująca. Pozostałe dwa obsługiwane tryby to MODE_WORLD_READABLEi MODE_WORLD_WRITEABLE. W MODE_WORLD_READABLEinnej aplikacji można odczytać utworzony plik, ale nie można go zmodyfikować. W przypadku MODE_WORLD_WRITEABLEinnych aplikacji mają również uprawnienia do zapisu dla utworzonego pliku.

Wreszcie, gdy już masz instancję preferencji, oto jak możesz pobrać zapisane wartości z preferencji:

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

Do przechowywania wartości w pliku preferencji SharedPreference.Editornależy użyć obiektu. Editorjest zagnieżdżonym interfejsem w SharedPreferenceklasie.

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 komponenty aplikacji. Ale jeśli nie musisz udostępniać preferencji innym komponentom i chcesz mieć prywatne preferencje dotyczące działania, możesz to zrobić za pomocą getPreferences()metody działania. getPreferenceMetoda wykorzystuje getSharedPreferences()metodę o nazwie klasy aktywności 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ólnych preferencji.

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

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

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

Pentium10
źródło
55
+1: uratowałeś mi dzień .. żaden z samouczków / przykładów w Internecie nie mówi o tym. wszystkie mówią o funkcjach i dostosowaniach abt, ale nie o tym, jak je przeczytać.
ankitjaininfo
1
Zobacz moją aktualizację odpowiedzi, a nazwa pliku jest podobna, package.prefsale nie jestem pewien.
Pentium10,
1
Dzięki za kod. Jest tylko jedna drobna rzecz, która mnie dezorientuje: SharedPreference to interfejs, więc gdzie jest zaimplementowany kod obsługujący wywołania metod?
x1886x
1
Chciałbym przeczytać to tydzień przed marnowaniem czasu na czytanie głupich frajerów odpowiedzi / komentarzy w całej SE, którzy myślą, że wiedzą, kiedy tak naprawdę nie są. Dzięki @ Pentium10, czy masz jakiś blog, dzięki jeszcze raz, naprawdę to doceniam :)
Sanjeevcn
1
Zamiast używać editor.commit (), możesz także użyć editor.apply (). Różnica polega na tym, że commit () zapisuje zmiany synchronicznie, a zastosowanie zapisuje je asynchronicznie. Dzięki temu interfejs użytkownika jest szybszy.
Hashim Akhtar
29

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

Android tworzy tę nazwę (być może na podstawie nazwy pakietu twojego projektu?). Możesz go uzyskać, umieszczając następujący kod w SettingsActivity onCreate()i sprawdzając, co preferencesNamejest.

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

Sznurek powinien być podobny com.example.projectname_preferences. Twardy kod, który gdzieś w twoim projekcie, i przekaż go getSharedPreferences()i powinieneś być gotowy.

Oprogramowanie Green Oak
źródło
1
Źródło działania brzmi: public SharedPreferences getPreferences (tryb int) {return getSharedPreferences (getLocalClassName (), tryb); }
Tatarize
22

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 ustawić pref:

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

zadzwoń, jeśli chcesz otrzymać pref:

getPref("myKey", getApplicationContext());

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

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);
kc ochibili
źródło
Dlaczego nie skorzystać z editor.apply (); zamiast zatwierdzania do przetwarzania w tle
Avi Parshan
4

konieczność wszędzie dookoła jest naprawdę denerwująca. kod staje się zbyt szczegółowy i niemożliwy do zarządzania. Zamiast tego robię to w każdym projekcie ...

public class global {
    public static Activity globalContext = null;

i ustaw go w głównym działaniu create

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

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

    global.globalContext = this;

także wszystkie klucze preferencji powinny być niezależne od języka, jestem zszokowany, nikt o tym nie wspominał.

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

teraz nazwij to tak po prostu w jednym wierszu kodu

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
hamish
źródło
4
Jakie są zalety uniezależnienia języka kluczy? Nigdy nie są pokazywane użytkownikowi, prawda?
Gerd
1
Na miłość boską, nigdy nie używaj Aktywności jako globalnego kontekstu. Jeśli musisz użyć globalnego kontekstu, zrób to przy użyciu niestandardowej klasy aplikacji.
Thorben,
1
@Thorben Zgoda. Lub po prostugetApplicationContext()
OneCricketeer
3

jeśli masz pole wyboru i chcesz pobrać jego wartość, tj. true / false w dowolnym pliku Java -

Posługiwać się--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
UrviG
źródło
0

Zaktualizowano 2019

Możesz po prostu użyć PowerPreferencebiblioteki

https://github.com/AliEsaAssadi/Android-Power-Preference

Pobieranie udostępnionego wystąpienia preferencji

Aby uzyskać domyślną instancję, wystarczy zadzwonić

PowerPreference.getDefaultFile()

Lub jeśli chcesz określonego pliku preferencji

PowerPreference.getFileByName(fileName)

Zapisywanie danych:

PowerPreference.getDefaultFile().put(key,value)

Pobieranie danych

PowerPreference.getDefaultFile().getString(key,value)
Ali Asadi
źródło
Jak PowerPreference obsługuje część kontekstową? Do odczytania udostępnionych prefiksów wymagany jest kontekst, prawda? Jestem nowy na Androida i staram się zrozumieć.
Yeti
0

Spróbuj użyć kodu źródłowego, który dla mnie zadziałał

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Istiak
źródło