Kayıtlı Tercih değerlerini kullan Android Jetpack'in bir parçasıdır.

Bu dokümanda, verilerin nasıl saklanacağı ve kullanılacağı tarafından kaydedilen Preference değerleri Tercih kitaplığı'nı tıklayın.

Tercih verileri depolama alanı

Bu bölümde, bir Preference öğesinin verileri nasıl saklayabileceği açıklanmaktadır.

PaylaşılanTercihler

Varsayılan olarak, bir Preference Kaydetmek için SharedPreferences değerler. SharedPreferences API, basit okuma ve yazmayı destekler uygulama oturumlarında kaydedilen bir dosyadaki anahtar/değer çiftleri. İlgili içeriği oluşturmak için kullanılan Tercih kitaplığı özel bir SharedPreferences örneği kullanır. Böylece yalnızca sizin erişebilir.

Örneğin, aşağıdaki gibi bir örnekle SwitchPreferenceCompat:

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

Kullanıcı bu anahtarı "açık" konuma getirdiğinde durum, SharedPreferences dosyası "notifications" : "true" anahtar/değer çiftiyle güncellenir. Kullanılan anahtar Preference için ayarlanan anahtarla aynıdır.

SharedPreferences API hakkında daha fazla bilgi için Anahtar/değer çiftini kaydetme verilerinizi kontrol edin.

Android'de veri depolamanın farklı yolları hakkında bilgi edinmek için Veriler ve dosya depolamaya genel bakış başlıklı makaleye göz atın.

PreferenceDataStore

Tercih kitaplığı, verileri SharedPreferences ile saklasa bile SharedPreferences her zaman ideal çözüm değildir. Örneğin, uygulamanız bir kullanıcının oturum açmasını gerektiriyorsa, buluttaki uygulama ayarlarını kullanarak, ayarların cihazlar ve platformlarda kullanabilirsiniz. Benzer bir şekilde, uygulamanızda cihazdaki her kullanıcının ayrı ayarları olabilir, Bu da SharedPreferences için ideal olmayan bir çözümdür.

PreferenceDataStore Preference değerlerini korumak için özel bir depolama arka ucu kullanmanızı sağlar. Daha fazla Özel veri deposu kullanma başlıklı makaleyi inceleyin.

Tercih değerlerini okuma

Kullanılmakta olan SharedPreferences nesnesini almak için şunu çağırın: PreferenceManager.getDefaultSharedPreferences() Bu yöntem uygulamanızın her yerinde kullanılabilse de uygulamanızı katmanlara bölersiniz. Daha fazla bilgi için bkz. Veriler katman.

Örneğin, "signature" anahtarı olan bir EditTextPreference verildiğinde, şöyle olur:

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

Bu Preference için kaydedilen değeri aşağıdaki şekilde dünya genelinde alabilirsiniz:

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", "");

Tercih değerlerinde yapılan değişiklikleri dinleme

Preference değerlerinde yapılan değişiklikleri dinlemek için iki ayardan birini seçebilirsiniz. arayüzler:

İki arayüzün farkı aşağıdaki tabloda gösterilmektedir:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
Tek bir Preference üzerinde ayarlandı. Preference nesnenin tümü için geçerlidir.
Preference kayıtlı değerini değiştirmek üzereyken çağrılır, beklemedeki değer, kaydedilen değerle aynı olsa bile geçerlidir. Yalnızca bir Preference için kaydedilen değer değiştiğinde çağrılır.
Yalnızca Preference kitaplığı üzerinden çağrılır. Ayrı bir bölüm kaydedilen değeri değiştirebilir. Ayrı bir değerden olsa bile, kaydedilen değer her değiştiğinde çağrılır. bir kontrol noktası görevi görebilir.
Beklemedeki değer kaydedilmeden önce çağrılır. Değer kaydedildikten sonra çağrılır.
SharedPreferences veya PreferenceDataStore. Yalnızca SharedPreferences kullanılırken çağrılır.

OnPreferenceChangeListener Uygulamasını Uygulama

OnPreferenceChangeListener uygulamak, beklemedeki bir sesi dinlemenizi sağlar Preference değerine değiştirin. Ardından, değişikliklerin gerçekleşir. Örneğin, aşağıdaki kodda "name" anahtarı olan bir EditTextPreference değeri:

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

Daha sonra, bu işleyiciyi doğrudan setOnPreferenceChangeListener() şu şekilde:

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

OnSharedPreferenceChangeListener'ı uygulama

Preference değerlerini SharedPreferences kullanarak korurken şunları da kullanabilirsiniz: değişiklikleri dinlemek için bir SharedPreferences.OnSharedPreferenceChangeListener. Bu sayede, Preference tarafından kaydedilen değerler değiştirildiğinde bunu dinleyebilirsiniz. . Aşağıdaki örnekte, anahtara sahip EditTextPreference değerinin değişimini dinle "name":

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

Dinleyiciyi registerOnSharedPreferenceChangedListener() şu şekilde:

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

Java

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

Kotlin

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

Java

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

Activity veya Fragment uygulamanızda doğru yaşam döngüsü yönetimi için gösterildiği gibi, onResume() ve onPause() geri çağırmalarında bu işleyicinin kaydını iptal et aşağıdaki örnekte:

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

Özel veri deposu kullanın

Preference nesnelerini SharedPreferences kullanarak kalıcı hale getirmemizi önersek de özel bir veri deposu da kullanabilirsiniz. Aşağıdaki durumlarda özel bir veri deposu faydalı olabilir: değerleri veritabanında tutarsa veya değerler cihaza özgüyse, aşağıda gösterilmiştir.

Veri deposunu uygulama

Özel bir veri deposu uygulamak için PreferenceDataStore Aşağıdaki örnekte, String değerleri:

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.
    }
}

Kullanıcının engellenmemesi için ana iş parçacığı üzerinde zaman alan işlemler gerçekleştirin kullanır. Şunu içeren Fragment veya Activity için mümkün olduğu için: veri deposunun imha edilmesini istiyorsanız, verileri serileştirerek kullanıcı tarafından değiştirilen değerleri kaybetmeyin.

Veri deposunu etkinleştirme

Veri deponuzu uyguladıktan sonra, onCreatePreferences() böylece Preference nesnelerin veri deposunu kullanarak varsayılan SharedPreferences ayarını kullanabilirsiniz. Bu ayarı etkinleştirdiğinizde, her Preference veya hiyerarşinin tamamı için veri deposu oluşturun.

Belirli bir Preference için özel veri deposunu etkinleştirmek üzere şu çağrıyı yapın: setPreferenceDataStore() Preference üzerinde aşağıdaki örnekte gösterildiği gibi:

Kotlin

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

Java

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

Bir hiyerarşinin tamamı için özel veri deposunu etkinleştirmek üzere PreferenceManager üzerinde setPreferenceDataStore():

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

Java

PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager.setPreferenceDataStore(dataStore);

Belirli bir Preference için ayarlanan veri deposu, ilgili hiyerarşi için ayarlanır. Çoğu durumda, görebilirsiniz.