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.