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