Personalizzare le impostazioni Parte di Android Jetpack.
Questo documento descrive come personalizzare Preference
di oggetti nella gerarchia.
Trovare le preferenze
Per accedere a un singolo Preference
, ad esempio quando ottieni o imposti un Valore Preference
, utilizza PreferenceFragmentCompat.findPreference()
Questo metodo cerca nell'intera gerarchia un Preference
con la chiave specificata.
Ad esempio, per accedere a una EditTextPreference
con un di "signature"
, procedi nel seguente modo:
<EditTextPreference app:key="signature" app:title="Your signature"/>
Recupera questo Preference
utilizzando il seguente codice:
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. }
Controlla la visibilità delle preferenze
Puoi controllare quali oggetti Preference
sono visibili all'utente quando lo apri una schermata delle impostazioni. Ad esempio, se un determinato Preference
è sia significativa solo quando una funzionalità corrispondente è abilitata, potresti decidere di nascondere che Preference
quando la funzionalità è disattivata.
Per mostrare un Preference
solo quando una condizione è soddisfatta, imposta prima Preference
la visibilità su false nel file XML, come mostrato nell'esempio seguente:
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
In onCreatePreferences()
, mostra Preference
quando i valori corrispondenti è soddisfatta:
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); } } }
Aggiorna dinamicamente i riepiloghi
Un Preference
che mantiene i dati deve visualizzare il valore corrente nel summary per aiutare l'utente a comprendere meglio lo stato attuale del Preference
. Ad esempio, EditTextPreference
deve mostrare il testo salvato e ListPreference
deve mostrare la voce dell'elenco selezionata. Potresti inoltre avere Preference
oggetti che devono aggiornare il riepilogo in base a query stato esterno dell'app, ad esempio un Preference
che mostra una versione numero. Puoi farlo utilizzando un SummaryProvider
Utilizza un SimpleSummaryProvider
ListPreference
e EditTextPreference
includono semplici implementazioni di SummaryProvider
che mostrano automaticamente valore Preference
salvato come riepilogo. Se non viene salvato alcun valore, viene visualizzata la dicitura "Non impostare."
Per attivare queste implementazioni da XML, imposta app:useSimpleSummaryProvider="true"
.
In alternativa, nel codice puoi usare ListPreference.SimpleSummaryProvider.getInstance()
e EditTextPreference.SimpleSummaryProvider.getInstance()
per ottenere la semplice istanza SummaryProvider
e impostarla Preference
, come mostrato nell'esempio seguente:
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
Utilizza un valore SummaryProvider personalizzato
Puoi creare il tuo SummaryProvider
ed eseguire l'override provideSummary()
per personalizzare il riassunto ogni volta che viene richiesto da Preference
. Per ad esempio, il seguente EditTextPreference
mostra la lunghezza del relativo file come riepilogo:

EditTextPreference
. Supponi, ad esempio, di avere il seguente valore EditTextPreference
:
<EditTextPreference app:key="counting" app:title="Counting preference"/>
In onCreatePreferences()
, puoi creare un nuovo SummaryProvider
ed eseguire l'override provideSummary()
per restituire il riepilogo da visualizzare:
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(); } }); }
Il riepilogo Preference
mostra la lunghezza del valore salvato o dello stato "Non impostato" se non esistono valori salvati.
Personalizzare una finestra di dialogo EditTextPreference
All'interno di una finestra di dialogo EditTextPreference
, puoi personalizzare il comportamento del campo di testo: il collegamento OnBindEditTextListener
Questo listener viene richiamato quando la finestra di dialogo viene mostrata all'utente.
Ad esempio, puoi personalizzare una finestra di dialogo in modo da accettare solo numeri. Per prima cosa, crea EditTextPreference
:
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
Poi in onCreatePreferences()
, crea un nuovo OnBindEditTextListener
e sostituisci onBindEditText()
per personalizzare EditText
quando viene mostrato utente.
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); } }); }
Ora, quando la finestra di dialogo viene mostrata all'utente, la tastiera si apre solo in formato numerico in modo che l'utente possa inserire solo numeri nell'EditText
.
Azioni preferite
Un Preference
può avere un'azione specifica quando viene toccato. Ad esempio, un Preference
può fungere da link a una parte separata della tua app. Per aggiungere un'azione a un Preference
, puoi impostare un Intent
direttamente su Preference
o puoi impostare OnPreferenceClickListener
: per una logica più specifica.
Imposta un intent
Puoi impostare un Intent
su un Preference
per lanciare un nuovo Fragment
, Activity
o un'app separata ogni volta che tocchi Preference
. Questo è il come utilizzare Context.startActivity()
con un determinato Intent
.
Puoi impostare un Intent
in XML utilizzando un tag <intent>
nidificato. Le seguenti esempio definisce un Intent
che avvia un Activity
:
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
In alternativa, puoi utilizzare setIntent()
direttamente su un Preference
, come segue:
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
Puoi anche includere extra con un Intent
utilizzando un file 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>
Ecco un esempio di Preference
con Intent
che apre una pagina web:
<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);
Listener di clicpreferenza
Puoi impostare un OnPreferenceClickListener
su un Preference
, il che aggiunge un callback a onPreferenceClick()
quando viene toccato Preference
. Ad esempio: puoi utilizzare il listener per passare a un altro Fragment
o Activity
se hanno una logica più complessa per gestire la navigazione.
Per impostare un valore OnPreferenceClickListener
, utilizza un codice simile al seguente:
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });