Menggunakan nilai tersimpan Bagian dari Android Jetpack.
Topik ini menjelaskan cara menyimpan dan menggunakan nilai Preference
yang disimpan oleh
Library Preference.
Penyimpanan data Preference
Bagian ini menjelaskan bagaimana sebuah Preference
dapat menyimpan data.
SharedPreferences
Secara default, Preference
menggunakan SharedPreferences
untuk menyimpan nilai. SharedPreferences
API memungkinkan pembacaan dan penulisan
pasangan nilai kunci sederhana dari file yang disimpan di seluruh sesi aplikasi.
Library Preference menggunakan instance SharedPreferences
pribadi sehingga hanya
aplikasi Anda yang dapat mengaksesnya.
Sebagai contoh, asumsikan
SwitchPreferenceCompat
berikut:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
Saat pengguna mengalihkan tombol ini ke status On
, file SharedPreferences
diperbarui dengan pasangan nilai kunci "notifications" : "true"
. Perlu diketahui bahwa
kunci yang digunakan sama dengan kunci yang ditetapkan untuk Preference
.
Untuk informasi selengkapnya tentang SharedPreferences
API, lihat
Menyimpan data nilai kunci.
Untuk informasi tentang berbagai cara menyimpan data di Android, lihat Ringkasan penyimpanan data dan file.
PreferenceDataStore
Meskipun library Preference mempertahankan data menggunakan SharedPreferences
secara default,
SharedPreferences
tidak selalu merupakan solusi ideal. Misalnya, jika aplikasi
Anda mengharuskan pengguna untuk login, sebaiknya pertahankan setelan
aplikasi di cloud agar setelan tersebut diterapkan di semua perangkat dan
platform lainnya. Demikian pula, jika aplikasi Anda memiliki opsi konfigurasi yang
berlaku untuk perangkat tertentu, setiap pengguna di perangkat tersebut akan memiliki setelan terpisah, sehingga
SharedPreferences
menjadi solusi yang kurang ideal.
PreferenceDataStore
memungkinkan Anda menggunakan backend penyimpanan kustom untuk mempertahankan nilai Preference
. Untuk
informasi selengkapnya, lihat Menggunakan penyimpanan data kustom.
Membaca nilai Preference
Untuk mengambil objek SharedPreferences
yang sedang digunakan, panggil
PreferenceManager.getDefaultSharedPreferences()
.
Metode ini berfungsi dari mana pun dalam aplikasi. Misalnya, dengan mempertimbangkan
EditTextPreference
yang memiliki kunci "signature":
<EditTextPreference app:key="signature" app:title="Your signature"/>
Nilai tersimpan untuk Preference
ini dapat diambil secara global sebagai berikut:
Kotlin
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */) val name = sharedPreferences.getString("signature", "")
Java
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */); String name = sharedPreferences.getString(“signature”, "");
Memproses perubahan nilai Preference
Untuk memproses perubahan nilai Preference
, Anda dapat memilih antara dua
antarmuka:
Tabel di bawah menunjukkan perbedaan antara kedua antarmuka:
OnPreferenceChangeListener | OnSharedPreferenceChangeListener |
---|---|
Ditetapkan pada masing-masing Preference | Berlaku untuk semua Preference |
Dipanggil saat Preference akan mengubah nilai tersimpannya. Ini mencakup apakah nilai tertunda sama dengan nilai tersimpan saat ini. | Hanya dipanggil jika nilai tersimpan untuk Preference telah berubah. |
Hanya dipanggil melalui library Preference. Bagian aplikasi yang terpisah dapat mengubah nilai tersimpan. | Dipanggil setiap kali nilai tersimpan berubah, meskipun nilai tersebut berasal dari bagian aplikasi yang terpisah. |
Dipanggil sebelum nilai tertunda disimpan. | Dipanggil setelah nilai disimpan. |
Dipanggil saat menggunakan SharedPreferences atau PreferenceDataStore . |
Hanya dipanggil saat menggunakan SharedPreferences . |
OnPreferenceChangeListener
Dengan mengimplementasikan OnPreferenceChangeListener
, Anda dapat memproses kapan nilai
Preference
akan berubah. Dari sana, Anda dapat memvalidasi apakah
perubahan ini harus terjadi. Misalnya, kode di bawah ini menunjukkan cara memproses
perubahan nilai EditTextPreference
dengan kunci "name":
Kotlin
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { Log.e("preference", "Pending Preference value is: $newValue") return true }
Java
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.e("preference", "Pending Preference value is: " + newValue); return true; }
Selanjutnya, Anda harus menetapkan pemroses ini secara langsung dengan
setOnPreferenceChangeListener()
,
sebagaimana ditunjukkan di bawah ini:
Kotlin
preference.onPreferenceChangeListener = ...
Java
preference.setOnPreferenceChangeListener(...);
OnSharedPreferenceChangeListener
Jika nilai Preference
dipertahankan menggunakan SharedPreferences
, Anda juga dapat menggunakan
SharedPreferences.OnSharedPreferenceChangeListener
untuk memproses perubahan.
Hal ini memungkinkan Anda memproses kapan nilai yang disimpan oleh Preference
berubah, misalnya saat menyinkronkan setelan dengan server. Contoh di bawah ini menunjukkan
cara memproses kapan nilai EditTextPreference
dengan kunci "name"
berubah:
Kotlin
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { if (key == "signature") { Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, "")) } }
Java
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals(“signature”)) { Log.i(TAG, “Preference value was updated to: “ + sharedPreferences.getString(key, "")); } }
Anda juga harus mendaftarkan pemroses melalui
registerOnSharedPreferenceChangedListener()
,
sebagaimana ditunjukkan di bawah ini:
Kotlin
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
Java
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
Kotlin
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
Java
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
Untuk mengelola siklus proses dengan baik di Activity
atau Fragment
, Anda harus
mendaftarkan dan membatalkan pendaftaran pemroses ini dalam callback onResume()
dan onPause()
,
sebagaimana ditunjukkan di bawah ini:
Kotlin
override fun onResume() { super.onResume() preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) } override fun onPause() { super.onPause() preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) }
Java
@Override public void onResume() { super.onResume(); getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); }
Menggunakan penyimpanan data kustom
Meskipun mempertahankan objek Preference
menggunakan SharedPreferences
direkomendasikan,
Anda juga dapat menggunakan penyimpanan data kustom. Penyimpanan data kustom dapat berguna jika aplikasi
Anda mempertahankan nilai ke database atau jika, misalnya, nilai hanya berlaku untuk perangkat
tertentu.
Mengimplementasikan penyimpanan data
Untuk mengimplementasikan penyimpanan data kustom, pertama-tama buat class yang memperluas
PreferenceDataStore
.
Contoh di bawah ini membuat penyimpanan data yang menangani nilai String
:
Kotlin
class DataStore : PreferenceDataStore() { override fun putString(key: String, value: String?) { // Save the value somewhere } override fun getString(key: String, defValue: String?): String? { // Retrieve the value } }
Java
public class DataStore extends PreferenceDataStore { @Override public void putString(String key, @Nullable String value) { // Save the value somewhere } @Override @Nullable public String getString(String key, @Nullable String defValue) { // Retrieve the value } }
Pastikan untuk menjalankan operasi apa pun yang memakan waktu lama di luar thread utama untuk menghindari
pemblokiran antarmuka pengguna. Karena Fragment
atau Activity
mungkin
berisi penyimpanan data yang akan dihancurkan saat masih mempertahankan nilai,
Anda harus melakukan serialisasi data agar tidak kehilangan nilai apa pun yang diubah pengguna.
Mengaktifkan penyimpanan data
Setelah mengimplementasikan penyimpanan data, Anda harus menetapkan penyimpanan data baru di
onCreatePreferences()
agar objek Preference
mempertahankan nilai dengan
penyimpanan data, bukan menggunakan SharedPreferences
default. Penyimpanan data dapat
diaktifkan untuk setiap Preference
atau seluruh hierarki.
Guna mengaktifkan penyimpanan data kustom untuk Preference
tertentu, panggil
setPreferenceDataStore()
pada Preference
, sebagaimana ditunjukkan dalam contoh di bawah ini:
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
Java
Preference preference = findPreference(“key”); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
Guna mengaktifkan penyimpanan data kustom untuk seluruh hierarki, panggil
setPreferenceDataStore()
pada PreferenceManager
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
Java
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
Penyimpanan data yang ditetapkan untuk Preference
tertentu mengganti penyimpanan data apa pun
yang ditetapkan untuk hierarki terkaitnya. Dalam sebagian besar kasus, Anda harus menetapkan
penyimpanan data untuk seluruh hierarki.