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