Dostosuj swoje ustawienia Część Android Jetpack.

Z tego dokumentu dowiesz się, jak dostosowywać obiekty Preference w hierarchii.

Znajdź ustawienia

Aby uzyskać dostęp do pojedynczej wartości Preference, np. przy pobieraniu lub ustawianiu wartości Preference, użyj funkcji PreferenceFragmentCompat.findPreference(). Ta metoda przeszukuje całą hierarchię pod kątem elementu Preference z danym kluczem.

Aby na przykład uzyskać dostęp do instancji EditTextPreference z kluczem "signature", wykonaj te czynności:

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

Pobierz ten produkt (Preference), używając tego kodu:

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.
}

Widoczność preferencji

Możesz określić, które obiekty Preference są widoczne dla użytkownika po przejściu na ekran ustawień. Jeśli na przykład określony Preference ma znaczenie tylko wtedy, gdy jest włączona odpowiednia funkcja, możesz ukryć ten Preference, gdy ta funkcja jest wyłączona.

Aby wyświetlić element Preference tylko wtedy, gdy warunek zostanie spełniony, najpierw ustaw w pliku XML wartość Preference na „false”, jak w tym przykładzie:

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

W funkcji onCreatePreferences() pokaż Preference, gdy zostanie spełniony odpowiedni warunek:

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

Dynamiczne aktualizowanie podsumowań

Element Preference, który utrzymuje się z danymi, musi wyświetlać bieżącą wartość w podsumowaniu, aby ułatwić użytkownikowi zrozumienie bieżącego stanu obiektu Preference. Na przykład EditTextPreference musi wyświetlać zapisaną wartość tekstową, a ListPreference – wybraną pozycję na liście. Mogą też być dostępne obiekty Preference, które wymagają aktualizowania podsumowania na podstawie stanu aplikacji wewnętrznej lub zewnętrznej. Przykładem jest obiekt Preference, który wyświetla numer wersji. Aby to zrobić, użyj SummaryProvider.

Używanie obiektu SimpleSummaryProvider

Metody ListPreference i EditTextPreference obejmują proste implementacje SummaryProvider, które automatycznie wyświetlają zapisaną wartość Preference jako podsumowanie. Jeśli nie zostanie zapisana żadna wartość, wyświetli się komunikat „Nie ustawiono”.

Aby włączyć te implementacje z kodu XML, ustaw app:useSimpleSummaryProvider="true".

Możesz też użyć w kodzie ListPreference.SimpleSummaryProvider.getInstance() i EditTextPreference.SimpleSummaryProvider.getInstance(), aby uzyskać prostą instancję SummaryProvider, a następnie ustawić ją w Preference, jak w tym przykładzie:

Kotlin

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

Java

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

Używanie niestandardowego dostawcy podsumowania

Możesz utworzyć własny SummaryProvider i zastąpić go provideSummary(), aby dostosować podsumowanie zawsze, gdy o to poprosi Preference. Na przykład ciąg EditTextPreference wyświetla długość zapisanej wartości jako podsumowanie:

Obraz przedstawiający przykładową wartość EditTextPreference
Rysunek 1. Przykład: EditTextPreference.

Dla przykładu przyjmijmy, że EditTextPreference:

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

W onCreatePreferences() możesz utworzyć nowy SummaryProvider i zastąpić provideSummary(), aby wyświetlić podsumowanie:

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

Podsumowanie Preference wyświetla długość zapisanej wartości lub „Nie ustawiono”, jeśli nie ma żadnej zapisanej wartości.

Dostosowywanie okna EditTextPreference

W oknie EditTextPreference możesz dostosować działanie pól tekstowych, dołączając OnBindEditTextListener. Ten detektor jest wywoływany po pokazaniu okna użytkownikowi.

Możesz na przykład dostosować okno, by akceptowało tylko cyfry. Najpierw utwórz EditTextPreference:

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

Następnie w zadaniu onCreatePreferences() utwórz nowy OnBindEditTextListener i zastąp onBindEditText(), aby dostosować EditText, gdy jest wyświetlany użytkownikowi.

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

Teraz, gdy użytkownikowi wyświetla się okno, klawiatura otwiera się w trybie liczbowym, aby użytkownik mógł wpisać w EditText tylko cyfry.

Działania związane z preferencjami

Kliknięcie przycisku Preference może wywołać określone działanie. Element Preference może na przykład działać jako link do oddzielnej części aplikacji. Aby dodać działanie do Preference, możesz ustawić Intent bezpośrednio w Preference lub ustawić OnPreferenceClickListener, aby uzyskać bardziej szczegółową logikę.

Określ intencję

Możesz ustawić Intent na Preference, aby uruchamiać nową aplikację Fragment lub Activity lub osobną aplikację po kliknięciu Preference. Działa to tak samo jak użycie właściwości Context.startActivity() z podanym parametrem Intent.

Intent możesz ustawić w pliku XML, korzystając z zagnieżdżonego tagu <intent>. Poniższy przykład określa Intent, który uruchamia Activity:

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

Możesz też użyć setIntent() bezpośrednio na Preference w następujący sposób:

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

Java

Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);

Możesz też dołączyć dodatki z elementem Intent za pomocą kodu XML:

<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>

Oto przykład elementu Preference z elementem Intent, który uruchamia stronę internetową:

<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

Możesz ustawić OnPreferenceClickListener w Preference, co spowoduje dodanie wywołania zwrotnego do onPreferenceClick() po kliknięciu Preference. Możesz np. użyć detektora, aby przejść do innego elementu Fragment lub Activity, jeśli masz bardziej złożoną logikę do obsługi nawigacji.

Aby ustawić OnPreferenceClickListener, użyj kodu podobnego do tego:

Kotlin

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

Java

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