Menggunakan nilai tersimpan

Menggunakan nilai tersimpan   Bagian dari Android Jetpack.

Topik ini menjelaskan cara menyimpan dan menggunakan nilai Preference yang disimpan oleh Preference Library.

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 berbagai sesi aplikasi. Preference Library menggunakan instance SharedPreferences pribadi sehingga hanya aplikasi Anda yang dapat mengaksesnya.

Sebagai contoh, asumsikan berikut ini SwitchPreferenceCompat:

    <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". Perhatikan 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

Sementara Preference Library menyimpan data menggunakan SharedPreferences secara default, tidak selalu merupakan solusi ideal. Misalnya, jika aplikasi Anda mengharuskan pengguna untuk login, sebaiknya Anda menyimpan setelan aplikasi di cloud agar setelan tersebut diterapkan di berbagai 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 bukanlah solusi yang ideal.

PreferenceDataStore memungkinkan Anda menggunakan backend penyimpanan kustom untuk menyimpan 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 saja dalam aplikasi Anda. 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 seperti 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”, "");
    

Memantau perubahan nilai Preference

Untuk memantau perubahan nilai Preference, Anda dapat memilih antara dua antarmuka:

Tabel di bawah menunjukkan perbedaan antara kedua antarmuka:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
Ditetapkan berdasarkan setiap Preference Berlaku untuk semua Preference
Dipanggil ketika Preference akan mengubah nilai tersimpannya. Ini mencakup apakah nilai yang tertunda sama dengan nilai yang tersimpan saat ini. Dipanggil hanya jika nilai yang disimpan untuk Preference telah berubah.
Hanya dipanggil melalui Preference Library. Bagian lain pada aplikasi dapat mengubah nilai tersimpan. Dipanggil setiap kali nilai yang disimpan berubah, meskipun nilai itu berasal dari bagian lain pada aplikasi.
Dipanggil sebelum nilai yang tertunda disimpan. Dipanggil setelah nilai disimpan.
Dipanggil saat menggunakan SharedPreferences atau PreferenceDataStore. Hanya dipanggil saat menggunakan SharedPreferences.

OnPreferenceChangeListener

Dengan menerapkan OnPreferenceChangeListener, Anda dapat memantau kapan nilai Preference akan berubah. Dari sana, Anda dapat memvalidasi apakah perubahan ini perlu terjadi. Misalnya, kode di bawah ini menunjukkan cara memantau 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 perlu menetapkan pemroses ini secara langsung dengan setOnPreferenceChangeListener(), seperti ditunjukkan di bawah ini:

Kotlin

    preference.onPreferenceChangeListener = ...
    

Java

    preference.setOnPreferenceChangeListener(...);
    

OnSharedPreferenceChangeListener

Jika nilai Preference disimpan menggunakan SharedPreferences, Anda juga dapat menggunakan SharedPreferences.OnSharedPreferenceChangeListener untuk memantau perubahan. Hal ini memungkinkan Anda memantau kapan nilai yang disimpan oleh Preference berubah, misalnya saat menyinkronkan setelan dengan server. Contoh di bawah ini menunjukkan cara memantau 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(), seperti 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 di callback onResume() dan onPause(), seperti 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 menyimpan objek Preference menggunakan SharedPreferences merupakan pendekatan yang direkomendasikan, Anda juga dapat menggunakan penyimpanan data kustom. Penyimpanan data kustom dapat berguna jika aplikasi Anda menyimpan nilai ke sebuah database atau jika, misalnya, nilai hanya berlaku untuk perangkat tertentu.

Menerapkan penyimpanan data

Untuk menerapkan 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 menyimpan nilai, sebaiknya Anda menyerialkan data agar tidak kehilangan nilai apa pun yang diubah oleh pengguna.

Mengaktifkan penyimpanan data

Setelah menerapkan penyimpanan data, Anda harus menetapkan penyimpanan data baru di onCreatePreferences() agar objek Preference menyimpan nilai ke penyimpanan data, bukan menggunakan SharedPreferences default. Penyimpanan data dapat diaktifkan untuk setiap Preference atau untuk seluruh hierarki.

Untuk mengaktifkan penyimpanan data kustom untuk Preference tertentu, panggil setPreferenceDataStore() di , seperti ditunjukkan dalam contoh di bawah:

Kotlin

    val preference: Preference? = findPreference("key")
    preference?.preferenceDataStore = dataStore
    

Java

    Preference preference = findPreference(“key”);
    if (preference != null) {
        preference.setPreferenceDataStore(dataStore);
    }
    

Untuk 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. Pada umumnya, Anda perlu menetapkan penyimpanan data untuk seluruh hierarki.