Ayarlarınızı özelleştirme Android Jetpack'in bir parçasıdır.

Bu dokümanda, projenizin nasıl özelleştirileceği ve Hiyerarşinizde Preference nesne var.

Tercihleri bulma

Tek bir Preference hesabına erişmek için (örneğin, bir Preference değeri, kullanım PreferenceFragmentCompat.findPreference() Bu yöntem, hiyerarşinin tamamında verilen anahtara sahip bir Preference için arama yapar.

Örneğin, EditTextPreference anahtarı "signature" için aşağıdaki işlemleri yapın:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Aşağıdaki kodu kullanarak bu Preference öğesini 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üğünü kontrol et

Kullanıcı tarafından görülebilecek Preference nesneleri kontrol edebilirsiniz. bir ayarlar ekranına gidin. Örneğin, belirli bir Preference yalnızca karşılık gelen özellik etkinleştirildiğinde anlam ifade etmezse, bu noktaları gizlemek Preference.

Yalnızca bir koşul karşılandığında Preference gösterilmesi için önce Preference özelliğini ayarlayın aşağıdaki örnekte gösterildiği gibi XML'de false (yanlış) olarak ayarlayın:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"
        app:isPreferenceVisible="false"/>

onCreatePreferences() içinde, Preference karşılık gelen koşul karşılanır:

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 saklayan bir Preference, geçerli değeri sayfanın mevcut durumunu daha iyi anlamasına yardımcı olacak bir özet Preference Örneğin, EditTextPreference, kayıtlı metni göstermelidir değeri ve ListPreference seçili liste girişini göstermelidir. Ayrıca özetlerini dahili veya harici yapılandırmaya göre güncellemesi gereken Preference nesne harici uygulama durumu (örneğin, bir sürümü gösteren Preference) sayı. Bunu yapmak için SummaryProvider.

SimpleSummaryProvider kullanma

ListPreference ve EditTextPreference otomatik olarak görüntüleyen basit SummaryProvider uygulamalarını içerme özet olarak Preference değeri kaydedildi. Hiçbir değer kaydedilmezse "Not" ayar."

Bu uygulamaları XML'den etkinleştirmek için app:useSimpleSummaryProvider="true"

Alternatif olarak, kodda ListPreference.SimpleSummaryProvider.getInstance() ve EditTextPreference.SimpleSummaryProvider.getInstance() basit SummaryProvider örneğini alıp Preference, aşağıdaki örnekte gösterildiği gibi:

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

Java

listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

Özel bir SummaryProvider kullanma

Kendi SummaryProvider öğenizi oluşturup geçersiz kılabilirsiniz provideSummary() özelleştirilebilir.Preference Örneğin, Örneğin, aşağıdaki EditTextPreference kaydedilen öğe ile ilişkili değerini özetleyin:

EditTextPreference örneğini gösteren bir resim
Şekil 1. Örnek: EditTextPreference.

Örnek olarak aşağıdaki EditTextPreference değerini varsayalım:

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

onCreatePreferences() ürününde yeni bir SummaryProvider oluşturup geçersiz kılabilirsiniz. Özetin gösterilmesini sağlamak için provideSummary() tuşuna basın:

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 özetinde, kaydedilen değerin uzunluğu veya "Belirlenmedi" durumu gösterilir. kayıtlı değer olmadığında.

EditTextPreference iletişim kutusunu özelleştirme

EditTextPreference iletişim kutusunda metin alanı davranışını şu şekilde özelleştirebilirsiniz: bir OnBindEditTextListener İ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. Öncelikle, EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

Sonra, onCreatePreferences() içinde yeni bir OnBindEditTextListener oluşturun ve onBindEditText()EditText belirtir.

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 değer olarak açılıyor modunda olmalıdır, böylece kullanıcı EditText. alanına yalnızca sayı girebilir.

Tercih işlemleri

Preference, dokunulduğunda belirli bir işlem gerçekleştirebilir. Örneğin, Preference, uygulamanızın ayrı bir bölümüne bağlantı işlevi görebilir. İşlem eklemek için Preference olarak doğrudan Preference üzerinde bir Intent ayarlayabilir veya CANNOT TRANSLATE OnPreferenceClickListener mantık yürütmeliyiz.

Amaç belirleyin

Yeni bir Fragment başlatmak için Preference üzerinde Intent ayarlayabilirsiniz. Activity ya da Preference her dokunulduğunda ayrı bir uygulama kullanın. Bu, ile aynı Context.startActivity() içeren bir Intent

İç içe yerleştirilmiş bir <intent> etiketi kullanarak XML'de Intent ayarlayabilirsiniz. Aşağıdakiler örneği, Activity başlatan bir Intent tanımlar:

<Preference
        app:key="activity"
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity"/>
</Preference>

Alternatif olarak, aşağıdaki şekilde setIntent() öğesini 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);

Ayrıca XML kullanarak 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>

Aşağıda, web sayfasını açan Intent içeren bir Preference örneği verilmiştir:

<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 üzerinde bir OnPreferenceClickListener ayarlayabilirsiniz. Bu durumda, Preference dokunulduğunda onPreferenceClick() geri çağrılır. Örneğin, dinleyiciyi kullanarak başka bir Fragment veya Activity konumuna gidebilirsiniz. kullanımı daha karmaşık bir mantığa sahiptir.

OnPreferenceClickListener ayarlamak için şuna benzer bir kod kullanın:

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // Do something.
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // Do something.
    return true;
});