Menggunakan nilai yang disimpan   Part of Android Jetpack.

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

Penyimpanan data preferensi

Bagian ini menjelaskan bagaimana Preference dapat mempertahankan data.

SharedPreferences

Secara default, Preference menggunakan SharedPreferences untuk menyimpan nilai. API SharedPreferences memungkinkan untuk membaca dan menulis 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 SwitchPreferenceCompat berikut:

<SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

Saat pengguna mengalihkan switch ini ke status On, file SharedPreferences diupdate dengan pasangan nilai-kunci "notifications" : "true". Perhatikan bahwa kunci yang digunakan sama dengan kunci yang ditetapkan untuk Preference.

Untuk informasi lebih lanjut tentang API SharedPreferences, lihat Menyimpan data kunci-nilai.

Untuk informasi tentang beragam cara untuk menyimpan data di Android, lihat Gambaran umum penyimpanan data dan file.

PreferenceDataStore

Meskipun Preference Library mempertahankan data dengan SharedPreferences secara default, SharedPreferences tidak selalu menjadi solusi yang ideal. Misalnya, jika aplikasi Anda mewajibkan pengguna untuk login, Anda mungkin ingin mempertahankan setelan aplikasi di cloud sehingga setelan tersebut tercermin di berbagai perangkat dan platform. Demikian pula, jika aplikasi Anda memiliki opsi konfigurasi yang spesifik perangkat, setiap pengguna pada perangkat akan memiliki setelan terpisah, yang membuat SharedPreferences menjadi solusi yang kurang ideal.

PreferenceDataStore memungkinkan Anda untuk menggunakan backend penyimpanan khusus untuk mempertahankan nilai Preference. Untuk informasi lebih lanjut, lihat Menggunakan penyimpanan data khusus.

Membaca Nilai Preference

Untuk mengambil objek SharedPreferences yang sedang digunakan, panggil PreferenceManager.getDefaultSharedPreferences(). Metode ini berfungsi dari mana saja di aplikasi Anda. Misalnya, diasumsikan EditTextPreference dengan kunci "signature":

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Nilai yang disimpan 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”, "");

Mendengarkan perubahan nilai Preference

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

Tabel di bawah ini menunjukkan perbedaan di kedua antarmuka:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
Disetel berdasarkan per-Preference Berlaku untuk semua Preference
Dipanggil bila Preference akan mengubah nilainya yang disimpan. Ini termasuk jika nilai yang tertunda sama dengan nilai yang saat ini disimpan. Dipanggil hanya ketika nilai yang disimpan untuk Preference telah berubah.
Hanya dipanggil melalui perpustakaan Preference Library. Bagian aplikasi terpisah dapat mengubah nilai yang disimpan. Dipanggil setiap kali nilai yang disimpan telah berubah, meskipun berasal dari bagian aplikasi yang terpisah.
Dipanggil sebelum nilai yang tertunda disimpan. Dipanggil setelah nilai disimpan.
Dipanggil saat menggunakan SharedPreferences atau PreferenceDataStore. Hanya dipanggil saat menggunakan SharedPreferences.

OnPreferenceChangeListener

Menerapkan OnPreferenceChangeListener memungkinkan Anda mendengarkan ketika nilai Preference akan berubah. Dari sini, Anda dapat memvalidasi jika perubahan ini terjadi. Misalnya, kode di bawah menunjukkan cara mendengarkan perubahan menjadi 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 mengatur listener ini secara langsung dengan setOnPreferenceChangeListener(), seperti yang ditunjukkan di bawah:

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

OnSharedPreferenceChangeListener

Saat mempertahankan Preference nilai menggunakan SharedPreferences, Anda juga dapat menggunakan SharedPreferences.OnSharedPreferenceChangeListener untuk mendengarkan perubahan. Ini memungkinkan Anda mendengarkan ketika nilai yang disimpan oleh Preference Anda diubah, seperti saat menyinkronkan pengaturan dengan server. Contoh di bawah ini menunjukkan cara mendengarkan ketika 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 listener melalui registerOnSharedPreferenceChangedListener(), seperti yang ditunjukkan di bawah:

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

Java

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

Kotlin

val listener: SharedPreferences.OnSharedPreferenceChangeListener =
        SharedPreferences.OnSharedPreferenceChangeListener {...}

Java

SharedPreferences.OnSharedPreferenceChangeListener listener =
        new SharedPreferences.OnSharedPreferenceChangeListener() {...}

Untuk manajemen siklus hidup yang tepat dalam Activity atau Fragment Anda, Anda harus mendaftar dan membatalkan pendaftaran listener ini dalam callback onResume() dan onPause(), seperti yang ditunjukkan di bawah:

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 khusus

Meskipun objek Preference yang bertahan menggunakan SharedPreferences direkomendasikan, Anda juga dapat menggunakan penyimpanan data khusus. Penyimpanan data khusus dapat berguna jika aplikasi Anda mempertahankan nilai ke database atau jika nilai-nilai tersebut spesifik-perangkat, misalnya.

Menerapkan penyimpanan data

Untuk menerapkan penyimpanan data khusus, pertama-tama buat kelas yang memperluas PreferenceDataStore. Contoh di bawah membuat penyimpanan data yang menangani nilai String:

Kotlin

class DataStore : PreferenceDataStore() {
    override fun putString(key: String, @Nullable value: String) {
        // Save the value somewhere
    }

    @Nullable
    override fun getString(key: String, @Nullable 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 yang menghabiskan waktu di utas utama untuk menghindari pemblokiran antarmuka pengguna. Karena dimungkinkan Fragment atau Activity yang berisi penyimpanan data untuk dimusnahkan sambil mempertahankan nilai, Anda harus membuat serialisasi data sehingga Anda tidak kehilangan nilai apa pun yang diubah oleh pengguna.

Mengaktifkan penyimpanan data

Setelah Anda menerapkan penyimpanan data, Anda harus menyetel penyimpanan data baru di onCreatePreferences() sehingga objek Preference mempertahankan nilai dengan penyimpanan data alih-alih menggunakan SharedPreferences default. Penyimpanan data dapat diaktifkan untuk setiap Preference atau untuk seluruh hierarki.

Untuk mengaktifkan penyimpanan data khusus untuk Preference tertentu, panggil setPreferenceDataStore() pada Preference, seperti yang ditunjukkan pada contoh di bawah:

Kotlin

val preference = findPreference("key")
preference.preferenceDataStore = dataStore

Java

Preference preference = findPreference(“key”);
preference.setPreferenceDataStore(dataStore);

Untuk mengaktifkan penyimpanan data khusus 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 spesifik menimpa penyimpanan data apa pun yang ditetapkan untuk hierarki terkait. Pada kebanyakan kejadian, Anda harus menetapkan penyimpanan data untuk seluruh hierarki.