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

Bu dokümanda, Tercih kitaplığı tarafından kaydedilen Preference değerlerinin nasıl saklanacağı ve kullanılacağı açıklanmaktadır.

Tercih verilerini depolama

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

Paylaşımlı Tercihler

Varsayılan olarak Preference, değerleri kaydetmek için SharedPreferences kullanır. SharedPreferences API, uygulama oturumlarında kaydedilen bir dosyadan basit anahtar/değer çiftlerinin okunmasını ve yazılmasını destekler. Tercih kitaplığı, özel bir SharedPreferences örneği kullanır. Böylece yalnızca uygulamanız erişebilir.

Örnek olarak şunları varsayalım: SwitchPreferenceCompat:

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

Bir kullanıcı bu anahtarı "açık" durumuna getirirse 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 çifti verilerini kaydetme bölümüne bakın.

Android'de veri depolamanın farklı yolları hakkında bilgi edinmek için Veri ve dosya depolamaya genel bakış sayfasını inceleyin.

TercihVeri Deposu

Tercih kitaplığı, verileri varsayılan olarak SharedPreferences ile saklasa da SharedPreferences her zaman ideal bir çözüm değildir. Örneğin, uygulamanız bir kullanıcının oturum açmasını gerektiriyorsa, uygulama ayarlarını bulutta kalıcı olarak tutarak ayarların diğer cihazlara ve platformlara yansıtılmasını sağlayabilirsiniz. Benzer şekilde, uygulamanızda cihaza özel yapılandırma seçenekleri varsa cihazdaki her kullanıcının ayrı ayarları olur. Bu da SharedPreferences ürününün ideal olmayan bir çözüm olmasını sağlar.

PreferenceDataStore, Preference değerlerini korumak için özel bir depolama arka ucu kullanmanıza olanak tanır. Daha fazla bilgi için Özel veri deposu kullanma bölümüne bakın.

Tercih değerlerini okuma

Kullanılmakta olan SharedPreferences nesnesini almak için PreferenceManager.getDefaultSharedPreferences() çağrısı yapın. Bu yöntem uygulamanızın herhangi bir yerinden çalışsa da uygulamanızı katmanlara bölmenizi öneririz. Daha fazla bilgi için Veri katmanı konusuna bakın.

Örneğin, "signature" anahtarına sahip bir EditTextPreference aşağıdaki şekilde verilmiştir:

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

Bu Preference için kaydedilen değeri global olarak aşağıdaki şekilde 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ğerlerindeki değişiklikleri incelemek için iki arayüz arasından seçim yapabilirsiniz:

Aşağıdaki tabloda, iki arayüzün arasındaki farklılıklar gösterilmektedir:

OnPreferenceChangeListener OnSharedPreferenceChangeListener
Tek bir Preference için ayarlandı. Preference nesnenin tümü için geçerlidir.
Preference değeri, kaydedilen değerle aynı olsa bile, kaydedilen değerini değiştirmek üzereyken çağrılır. Yalnızca Preference için kaydedilen değer değiştiğinde çağrılır.
Yalnızca Preference kitaplığı üzerinden çağrılır. Uygulamanın ayrı bir bölümü, kaydedilen değeri değiştirebilir. Kayıtlı değer her değiştiğinde, uygulamanın ayrı bir bölümünden olsa bile çağrılır.
Beklemedeki değer kaydedilmeden önce çağrılır. Değer kaydedildikten sonra çağrılır.
SharedPreferences veya PreferenceDataStore kullanılırken çağrıldı. Yalnızca SharedPreferences kullanılırken aranır.

OnPreferenceChangeListener'ı uygulayın

OnPreferenceChangeListener uygulamak, Preference değeri için beklemede olan bir değişikliği dinlemenize olanak tanır. Sonra, değişikliğin gerçekleşip gerçekleşmediğini doğrulayabilirsiniz. Örneğin, aşağıdaki kod "name" anahtarıyla EditTextPreference değerindeki değişikliğin nasıl dinleneceğini gösterir:

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

Ardından, bu işleyiciyi doğrudan setOnPreferenceChangeListener() ile aşağıdaki şekilde ayarlamanız gerekir:

Kotlin

preference.onPreferenceChangeListener = ...

Java

preference.setOnPreferenceChangeListener(...);

OnSharedPreferenceChangeListener'ı uygulama

SharedPreferences kullanarak Preference değerlerini sürdürürken, değişiklikleri dinlemek için bir SharedPreferences.OnSharedPreferenceChangeListener de kullanabilirsiniz. Bu sayede, Preference tarafından kaydedilen değerlerde değişiklik yapıldığında (örneğin, ayarları bir sunucuyla senkronize ederken) bunu dinleyebilirsiniz. Aşağıdaki örnekte, "name" anahtarıyla EditTextPreference değerinin nasıl değiştirileceği gösterilmektedir:

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

İşleyiciyi registerOnSharedPreferenceChangedListener() ile aşağıdaki şekilde kaydedin:

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 aşağıdaki örnekte gösterildiği gibi bu işleyiciyi onResume() ve onPause() geri çağırmalarına kaydedin ve kaydını silin:

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

Preference nesnelerini SharedPreferences kullanarak devam ettirmenizi önersek de özel bir veri deposu da kullanabilirsiniz. Uygulamanız, değerleri bir veritabanında tutuyorsa veya değerler cihaza özgüyse aşağıdaki örneklerde gösterildiği gibi özel veri deposu yararlı olabilir.

Veri deposunu uygulama

Özel bir veri deposu uygulamak için PreferenceDataStore kapsamını genişleten bir sınıf oluşturun. Aşağıdaki örnek, String değerlerini işleyen bir veri deposu oluşturur:

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ı arayüzünün engellenmemesi için zaman alan tüm işlemleri ana iş parçacığında çalıştırın. Veri deposunu içeren Fragment veya Activity, bir değeri sürdürürken kaldırılabilir. Bu nedenle, kullanıcı tarafından değiştirilen değerleri kaybetmemek için verileri serileştirin.

Veri deposunu etkinleştir

Veri deponuzu uyguladıktan sonra, varsayılan SharedPreferences kullanmak yerine Preference nesnelerinin veri deposunda değerleri koruması için onCreatePreferences() içinde yeni veri deposunu ayarlayın. Her Preference veya hiyerarşinin tamamı için bir veri deposu etkinleştirebilirsiniz.

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

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 için setPreferenceDataStore() çağrısı yapın:

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 ayarlanmış tüm veri depolarını geçersiz kılar. Çoğu durumda, hiyerarşinin tamamı için bir veri deposu ayarlarsınız.