Dostosowywanie ustawień Zawiera Android Jetpack.

W tym dokumencie opisujemy, jak dostosować Preference obiektów w hierarchii.

Znajdź preferencje

Aby uzyskać dostęp do pojedynczego elementu Preference, na przykład podczas pobierania lub ustawiania Wartość Preference, użyj PreferenceFragmentCompat.findPreference() Ta metoda przeszukuje całą hierarchię pod kątem elementu Preference z podanym kluczem.

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

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

Pobierz Preference przy użyciu 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.
}

Ustawienia widoczności

Możesz decydować, które obiekty Preference są widoczne dla użytkownika, gdy otwórz ekran ustawień. Jeśli na przykład określony Preference to istotne tylko wtedy, gdy włączona jest odpowiednia funkcja, możesz ukryć że Preference, gdy funkcja jest wyłączona.

Aby wyświetlać Preference tylko wtedy, gdy warunek jest spełniony, najpierw ustaw Preference widoczność na false w pliku XML, jak w tym przykładzie:

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

W narzędziu onCreatePreferences() pokaż Preference, gdy odpowiednia wartość spełniony jest 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ń

Pole Preference, które utrzymuje dane, musi wyświetlać bieżącą wartość w podsumowania, które pomogą użytkownikowi lepiej zrozumieć bieżący stan Preference Na przykład pole EditTextPreference musi wyświetlać zapisany tekst a ListPreference musi pokazywać wybraną pozycję na liście. Możesz też mają Preference obiekty, które muszą zaktualizować podsumowanie na podstawie danych wewnętrznych lub zewnętrzny stan aplikacji – np. Preference wyświetlający wersję aplikacji numer. Możesz to zrobić za pomocą SummaryProvider

Używanie klasy SimpleSummaryProvider

ListPreference oraz EditTextPreference można uwzględnić proste implementacje SummaryProvider, które automatycznie wyświetlają zapisano wartość Preference jako podsumowanie. Jeśli żadna wartość nie zostanie zapisana, pojawi się komunikat „Nie ustawione”.

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

Ewentualnie w kodzie możesz użyć ListPreference.SimpleSummaryProvider.getInstance() oraz EditTextPreference.SimpleSummaryProvider.getInstance() aby pobrać prostą instancję SummaryProvider, a następnie ustawić ją na Preference w następujący sposób:

Kotlin

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

Java

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

Użycie niestandardowego dostawcy podsumowania

Możesz utworzyć własne SummaryProvider i zastąpić provideSummary(). aby dostosować podsumowanie każdorazowo, gdy poprosi o to Preference. Dla: przykładowy EditTextPreference wyświetla długość zapisanej jako podsumowanie:

Obraz pokazujący przykładowy parametr EditTextPreference
Rysunek 1. Przykład: EditTextPreference.

Załóżmy na przykład, że EditTextPreference:

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

W onCreatePreferences() możesz utworzyć nową wartość 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 wartości „Nie ustawiono”. gdy nie ma zapisanych wartości.

Dostosowywanie okna EditTextPreference

W oknie EditTextPreference możesz dostosować działanie pól tekstowych przez załączenie OnBindEditTextListener Ten detektor jest wywoływany po wyświetleniu okna użytkownikowi.

Możesz np. dostosować okno dialogowe tak, aby przyjmowało tylko liczby. Najpierw utwórz EditTextPreference:

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

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

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 okno wyświetli się użytkownikowi, klawiatura otworzy się tylko z wartościami liczbowymi więc użytkownik może wpisywać w EditText tylko liczby.

Działania związane z ustawieniami

Kliknięcie przycisku Preference może wykonać konkretne działanie. Na przykład plik Preference może działać jako link do oddzielnej części aplikacji. Aby dodać działanie do Preference, możesz ustawić Intent bezpośrednio w Preference lub może ustawić OnPreferenceClickListener. aby uzyskać bardziej bardziej precyzyjną logikę.

Ustaw intencję

Możesz ustawić Intent na Preference, aby uruchomić nowy Fragment, Activity lub oddzielnie w przypadku kliknięcia przycisku Preference. To jest taka sama jak przy użyciu Context.startActivity() z danym Intent.

Możesz ustawić Intent w formacie XML za pomocą zagnieżdżonego tagu <intent>. Poniżej definiuje element 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 w Preference w ten 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ż dodać dodatki z elementem Intent przy użyciu 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 Preference z parametrem 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);

Detektor kliknięć OnPreferenceClickListener

Możesz ustawić OnPreferenceClickListener na Preference, co spowoduje dodanie wywołanie zwrotne do onPreferenceClick() po kliknięciu przycisku Preference. Przykład: możesz użyć detektora, aby przejść do innego elementu Fragment lub Activity, jeśli mają bardziej złożoną logikę w obsłudze nawigacji.

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

Kotlin

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

Java

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