Ayarlarınızı özelleştirin Android Jetpack'in bir parçasıdır.
Bu belgede, hiyerarşinizdeki Preference
nesnelerini nasıl özelleştireceğiniz açıklanmaktadır.
Tercihleri bulma
Bağımsız bir Preference
öğesine erişmek için (örneğin, bir Preference
değerini alırken veya ayarlarken) PreferenceFragmentCompat.findPreference()
işlevini kullanın.
Bu yöntem, belirtilen anahtarla bir Preference
için hiyerarşinin tamamında arama yapar.
Örneğin, "signature"
anahtarıyla bir EditTextPreference
adresine erişmek için aşağıdakileri yapın:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Aşağıdaki kodu kullanarak bu Preference
dosyasını alın:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); EditTextPreference signaturePreference = findPreference("signature"); // Do something with this preference. }
Tercih görünürlüğü kontrolü
Kullanıcılar bir ayarlar ekranına gittiğinde hangi Preference
nesnelerinin kullanıcı tarafından görülebileceğini kontrol edebilirsiniz. Örneğin, belirli bir Preference
yalnızca karşılık gelen bir özellik etkinleştirildiğinde anlamlıysa özellik devre dışıyken bu Preference
öğesini gizlemek isteyebilirsiniz.
Preference
değişkenini yalnızca bir koşul karşılandığında göstermek için önce aşağıdaki örnekte gösterildiği gibi, XML'de Preference
görünürlüğünü "false" olarak ayarlayın:
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
onCreatePreferences()
ürününde, ilgili koşul karşılandığında Preference
değerini gösterin:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); if(/*some feature*/) { EditTextPreference signaturePreference = findPreference("signature"); if (signaturePreference != null) { signaturePreference.setVisible(true); } } }
Özetleri dinamik olarak güncelleme
Verileri koruyan bir Preference
, kullanıcının Preference
öğesinin mevcut durumunu daha iyi anlamasına yardımcı olmak için özetinde geçerli değeri görüntülemelidir. Örneğin, EditTextPreference
öğesi kaydedilen metin değerini, ListPreference
öğesi ise seçilen liste girişini göstermelidir. Ayrıca, özetlerini dahili veya harici uygulama durumuna göre güncellemesi gereken Preference
nesneniz de olabilir (örneğin, sürüm numarası gösteren bir Preference
). Bunu SummaryProvider
kullanarak yapabilirsiniz.
SimpleSummaryProvider kullanma
ListPreference
ve EditTextPreference
kaydedilen Preference
değerini özet olarak otomatik olarak gösteren basit SummaryProvider
uygulamalarını içerir. Hiçbir değer kaydedilmezse "Ayarlanmadı" ifadesi gösterilir.
Bu uygulamaları XML'den etkinleştirmek için app:useSimpleSummaryProvider="true"
değerini ayarlayın.
Alternatif olarak, kodda basit SummaryProvider
örneğini almak için ListPreference.SimpleSummaryProvider.getInstance()
ve EditTextPreference.SimpleSummaryProvider.getInstance()
araçlarını kullanabilir ve ardından aşağıdaki örnekte gösterildiği gibi bunuPreference
üzerinde ayarlayabilirsiniz:
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Özel bir ÖzetSağlayıcı kullanın
Kendi SummaryProvider
öğenizi oluşturabilir ve Preference
tarafından istendiğinde özeti özelleştirmek için provideSummary()
öğesini geçersiz kılabilirsiniz. Örneğin, aşağıdaki EditTextPreference
, kaydedilen değerinin uzunluğunu özet olarak gösterir:
Örnek olarak, aşağıdaki EditTextPreference
varsayalım:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
onCreatePreferences()
içinde yeni bir SummaryProvider
oluşturabilir ve gösterilecek özeti döndürmek için provideSummary()
kodunu geçersiz kılabilirsiniz:
Kotlin
val countingPreference: EditTextPreference? = findPreference("counting") countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference -> val text = preference.text if (text.isNullOrEmpty()) { "Not set" } else { "Length of saved value: " + text.length } }
Java
EditTextPreference countingPreference = findPreference("counting"); if (countingPreference != null) { countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() { @Override public CharSequence provideSummary(EditTextPreference preference) { String text = preference.getText(); if (TextUtils.isEmpty(text) || text == null){ return "Not set"; } return "Length of saved value: " + text.length(); } }); }
Preference
özeti, kayıtlı değerin uzunluğunu veya kayıtlı değer olmadığında "Ayarlanmadı" değerini gösterir.
EditTextPreference iletişim kutusunu özelleştirme
EditTextPreference
iletişim kutusunda, bir OnBindEditTextListener
ekleyerek metin alanı davranışını özelleştirebilirsiniz.
İletişim kutusu kullanıcıya gösterildiğinde bu işleyici çağrılır.
Örneğin, bir iletişim kutusunu yalnızca sayıları kabul edecek şekilde özelleştirebilirsiniz. İlk olarak EditTextPreference
öğesini oluşturun:
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
Daha sonra, onCreatePreferences()
ürününde yeni bir OnBindEditTextListener
oluşturun ve kullanıcıya gösterildiğinde EditText
öğesini özelleştirmek için onBindEditText()
öğesini geçersiz kılın.
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
EditTextPreference numberPreference = findPreference("number"); if (numberPreference != null) { numberPreference.setOnBindEditTextListener( new EditTextPreference.OnBindEditTextListener() { @Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } }); }
Artık iletişim kutusu kullanıcıya gösterildiğinde klavye yalnızca sayısal modda açılır. Böylece kullanıcı EditText
alanına yalnızca sayı girebilir.
Tercih işlemleri
Preference
öğesine dokunulduğunda belirli bir işlem gerçekleştirilebilir. Örneğin, Preference
, uygulamanızın ayrı bir bölümüne bağlantı işlevi görebilir. Preference
öğesine işlem eklemek için doğrudan Preference
öğesinde Intent
veya daha spesifik bir mantık için OnPreferenceClickListener
ayarlayabilirsiniz.
Niyet Belirleyin
Yeni bir Fragment
Activity
başlatmak veya Preference
her dokunulduğunda ayrı bir uygulamayı başlatmak için Preference
cihazında bir Intent
ayarlayabilirsiniz. Bu, belirli bir Intent
ile Context.startActivity()
kullanımı ile aynıdır.
İç içe yerleştirilmiş bir <intent>
etiketini kullanarak XML biçiminde bir Intent
ayarlayabilirsiniz. Aşağıdaki örnekte, Activity
başlatan bir Intent
tanımlanmaktadır:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
Alternatif olarak, setIntent()
uygulamasını aşağıdaki gibi doğrudan bir Preference
üzerinde kullanabilirsiniz:
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
XML kullanarak bir Intent
ile ekstra özellikler de ekleyebilirsiniz:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"> <extra android:name="example_key" android:value="example_value"/> </intent> </Preference>
Bir web sayfasını açan ve Intent
içeren Preference
örneğini burada görebilirsiniz:
<Preference app:key="webpage" app:title="View webpage"> <intent android:action="android.intent.action.VIEW" android:data="http://www.google.com" /> </Preference>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); webpagePreference.setIntent(intent);
OnPreferenceClickListener
Preference
için bir OnPreferenceClickListener
ayarlayabilirsiniz. Böylece, Preference
dokunulduğunda onPreferenceClick()
öğesine geri arama eklenir. Örneğin, gezinmeyi işlemek için daha karmaşık bir mantığınız varsa başka bir Fragment
veya Activity
öğesine gitmek için işleyiciyi kullanabilirsiniz.
OnPreferenceClickListener
ayarlamak için aşağıdakine benzer bir kod kullanın:
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });