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.