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.