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 bir EditTextPreference&#39;yı gösteren resim
Şekil 1. Örnek EditTextPreference.

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