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:

Un&#39;immagine che mostra un esempio EditTextPreference
. Figura 1. Un esempio di 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;
});