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.