Bagaimana cara saya mendapatkan SharedPreferences dari PreferenceActivity di Android?

373

Saya menggunakan PreferenceActivity untuk menunjukkan beberapa pengaturan untuk aplikasi saya. Saya menggembungkan pengaturan melalui file xml sehingga onCreate saya (dan menyelesaikan metode kelas) terlihat seperti ini:

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

Javadoc dari PreferenceActivity PreferenceFragment menyatakan itu

Preferensi ini akan secara otomatis disimpan ke SharedPreferences saat pengguna berinteraksi dengannya. Untuk mengambil contoh SharedPreferences yang akan digunakan hierarki preferensi dalam aktivitas ini, panggil getDefaultSharedPreferences (android.content.Context) dengan konteks dalam paket yang sama dengan aktivitas ini.

Tetapi bagaimana saya mendapatkan nama SharedPreference di Aktivitas lain? Saya hanya bisa menelepon

getSharedPreferences(name, mode)

di aktivitas lain tapi saya perlu nama SharedPreference yang digunakan oleh PreferenceActivity. Apa nama atau bagaimana saya bisa mengambilnya?

Dave
sumber

Jawaban:

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

Memperbarui

Menurut Preferensi Bersama | Tutorial Pengembang Android (Bagian 13) oleh Sai Geetha MN,

Banyak aplikasi dapat menyediakan cara untuk menangkap preferensi pengguna pada pengaturan aplikasi atau aktivitas tertentu. Untuk mendukung ini, Android menyediakan satu set API sederhana.

Preferensi biasanya pasangan nilai nama. Mereka dapat disimpan sebagai "Preferensi Bersama" di berbagai aktivitas dalam aplikasi (perhatikan saat ini tidak dapat dibagi di seluruh proses). Atau bisa juga sesuatu yang perlu disimpan khusus untuk suatu kegiatan.

  1. Preferensi Bersama: Preferensi bersama dapat digunakan oleh semua komponen (aktivitas, layanan, dll) dari aplikasi.

  2. Preferensi yang ditangani aktivitas: Preferensi ini hanya dapat digunakan dalam aktivitas tertentu dan tidak dapat digunakan oleh komponen lain dari aplikasi.

Preferensi Bersama:

Preferensi bersama dikelola dengan bantuan getSharedPreferencesmetode Contextkelas. Preferensi disimpan dalam file default (1) atau Anda dapat menentukan nama file (2) yang akan digunakan untuk merujuk pada preferensi.

(1) Cara yang disarankan adalah menggunakan mode default, tanpa menentukan nama file

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Inilah cara Anda mendapatkan instance saat Anda menentukan nama file

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

MODE_PRIVATEadalah mode operasi untuk preferensi. Ini adalah mode default dan berarti file yang dibuat akan diakses oleh hanya aplikasi panggilan. Dua mode lain yang didukung adalah MODE_WORLD_READABLEdan MODE_WORLD_WRITEABLE. Di MODE_WORLD_READABLEaplikasi lain bisa membaca file yang dibuat tetapi tidak bisa memodifikasinya. Dalam hal MODE_WORLD_WRITEABLEaplikasi lain juga memiliki izin menulis untuk file yang dibuat.

Akhirnya, setelah Anda memiliki instance preferensi, berikut adalah cara Anda dapat mengambil nilai yang disimpan dari preferensi:

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

Untuk menyimpan nilai dalam SharedPreference.Editorobjek file preferensi harus digunakan. Editoradalah antarmuka bersarang di SharedPreferencekelas.

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

Editor juga mendukung metode seperti remove()dan clear()untuk menghapus nilai preferensi dari file.

Preferensi Kegiatan:

Preferensi bersama dapat digunakan oleh komponen aplikasi lain. Tetapi jika Anda tidak perlu membagi preferensi dengan komponen lain dan ingin memiliki aktivitas, preferensi pribadi Anda dapat melakukannya dengan bantuan getPreferences()metode aktivitas. The getPreferenceMetode menggunakan getSharedPreferences()metode dengan nama kelas aktivitas untuk nama file preferensi.

Berikut ini adalah kode untuk mendapatkan preferensi

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

Kode untuk menyimpan nilai juga sama seperti dalam hal preferensi bersama.

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

Anda juga dapat menggunakan metode lain seperti menyimpan status aktivitas dalam database. Catatan Android juga berisi paket yang disebut android.preference. Paket ini mendefinisikan kelas untuk mengimplementasikan UI preferensi aplikasi.

Untuk melihat beberapa contoh lainnya periksa pos Penyimpanan Data Android di situs pengembang.

Pentium10
sumber
55
+1: u menyelamatkan hari saya .. tidak ada tutorial / contoh di Internet yang menceritakan tentang ini. semua mereka berbicara tentang fitur dan kustomisasi, tetapi tidak bagaimana membacanya.
ankitjaininfo
1
Lihat pembaruan jawaban saya, dan nama filenya kira-kira package.prefstapi saya tidak yakin.
Pentium10
1
Terima kasih untuk kodenya. Hanya ada satu hal kecil yang membingungkan saya: SharedPreference adalah antarmuka, jadi di mana kode aktual diimplementasikan yang menangani panggilan metode apa pun?
x1886x
1
Berharap saya telah membaca ini seminggu sebelum membuang-buang waktu saya membaca beberapa kutu buku bodoh jawaban / komentar di seluruh SE, yang berpikir mereka tahu kapan mereka sebenarnya tidak .. Terima kasih @ Pentium10, apakah Anda memiliki blog, terima kasih lagi, sangat menghargainya :)
Sanjeevcn
1
Alih-alih menggunakan editor.commit (), Anda juga dapat menggunakan editor.apply (). Perbedaannya adalah commit () menulis perubahan Anda secara sinkron dan menerapkan menulisnya secara tidak sinkron. Ini membuat UI Anda lebih cepat.
Hashim Akhtar
29

Jika Anda tidak memiliki akses getDefaultSharedPreferenes(), Anda dapat menggunakannya getSharedPreferences(name, mode), Anda hanya perlu memasukkan nama yang benar.

Android membuat nama ini (mungkin berdasarkan nama paket proyek Anda?). Anda bisa mendapatkannya dengan memasukkan kode berikut ke dalam SettingsActivity onCreate(), dan melihat apa yang preferencesNameada.

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

String harus seperti ini com.example.projectname_preferences. Kode keras di suatu tempat di proyek Anda, dan meneruskannya ke getSharedPreferences()dan Anda harus baik untuk pergi.

Perangkat Lunak Green Oak
sumber
1
Sumber untuk aktivitas membaca: publik SharedPreferences getPreferences (mode int) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize
22

Deklarasikan metode ini terlebih dahulu ..

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

Kemudian panggil ini saat Anda ingin meletakkan pref:

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

panggil ini saat Anda ingin mendapatkan pref:

getPref("myKey", getApplicationContext());

Atau Anda dapat menggunakan objek ini https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo yang menyederhanakan semuanya lebih jauh

Contoh:

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
sumber
Mengapa tidak menggunakan editor.apply (); alih-alih komit untuk diproses di latar belakang
Avi Parshan
4

harus melewati konteks di mana-mana benar-benar mengganggu saya. kode menjadi terlalu bertele-tele dan tidak bisa diatur. Saya melakukan ini di setiap proyek sebagai gantinya ...

public class global {
    public static Activity globalContext = null;

dan mengaturnya di aktivitas utama buat

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

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

    global.globalContext = this;

juga semua kunci preferensi harus bahasa independen, saya terkejut tidak ada yang menyebutkan itu.

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

sekarang menyebutnya sangat sederhana seperti ini dalam satu baris kode

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);
hamish
sumber
4
Apa keuntungan membuat bahasa kunci mandiri? Mereka tidak pernah ditampilkan kepada pengguna, bukan?
Gerd
1
Tolong, untuk cinta tuhan, jangan pernah menggunakan Kegiatan sebagai Konteks global. Jika Anda harus menggunakan Konteks global maka silakan lakukan dengan menggunakan kelas Aplikasi kustom.
Thorben
1
@ Torben Setuju. Atau sederhananyagetApplicationContext()
OneCricketeer
3

jika Anda memiliki kotak centang dan Anda ingin mengambil nilainya yaitu benar / salah dalam file java apa saja -

Menggunakan--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`
UrviG
sumber
0

Diperbarui 2019

Anda cukup menggunakan PowerPreferenceperpustakaan

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

Mendapatkan contoh preferensi bersama

Untuk mendapatkan instance default, Anda hanya perlu menelepon

PowerPreference.getDefaultFile()

Atau jika Anda menginginkan file preferensi tertentu

PowerPreference.getFileByName(fileName)

Menulis data:

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

Mendapatkan Data

PowerPreference.getDefaultFile().getString(key,value)
Ali Asadi
sumber
Bagaimana PowerPreference menangani bagian konteks? Diperlukan konteks untuk membaca prefs yang dibagikan, bukan? Saya baru mengenal Android dan berusaha memahami.
Yeti
0

Coba ikuti kode sumber itu berhasil untuk saya

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Istiak
sumber