Impostazioni Componente di Android Jetpack.

Le impostazioni consentono agli utenti di modificare la funzionalità e il comportamento di un'app. Possono influire sul comportamento in background, ad esempio la frequenza con cui l'app sincronizza i dati con il cloud, oppure avere una copertura più ampia, ad esempio modificare i contenuti e la rappresentazione dell'interfaccia utente.

Per integrare le impostazioni configurabili dall'utente nella tua app, utilizza la libreria Preference di AndroidX. Questa libreria gestisce l'interfaccia utente e interagisce con lo spazio di archiviazione, consentendoti di definire solo le singole impostazioni che l'utente può configurare. La libreria è dotata di un tema Material Design che offre un'esperienza utente coerente su tutti i dispositivi e le versioni del sistema operativo.

Inizia

Una Preference è l'elemento di base della libreria Preference. Una schermata delle impostazioni contiene una gerarchia di Preference. Puoi definire questa gerarchia come risorsa XML oppure creare una gerarchia nel codice.

Le seguenti sezioni descrivono come creare una semplice schermata di impostazioni utilizzando la libreria AndroidX Preference.

Prima di iniziare, aggiungi la dipendenza della libreria di preferenze al tuo file build.gradle:

Trendy

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

Dopo una sincronizzazione Gradle, puoi passare alla parte XML dell'attività.

Creare una gerarchia

Nel progetto, vai alla cartella res/xml, crea un file preferences.xml e aggiungi il seguente codice:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

Questa gerarchia contiene due oggetti Preference: un SwitchPreferenceCompat che consente agli utenti di attivare e disattivare un'impostazione e un oggetto Preference di base senza widget.

Quando crei una gerarchia, ogni Preference deve avere una chiave univoca.

Ampliare la gerarchia

Per gonfiare una gerarchia da un attributo XML, crea un elemento PreferenceFragmentCompat, esegui l'override di onCreatePreferences() e fornisci la risorsa XML da modificare, come mostrato nell'esempio seguente:

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

Java

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

Puoi quindi aggiungere questo Fragment a Activity come fai con qualsiasi altro Fragment:

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

Java

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

Il risultato è mostrato nella seguente immagine:

Un&#39;immagine che mostra un esempio della schermata Preferenze
Figura 1. Una schermata delle impostazioni creata utilizzando due oggetti Preference.

Monitora le preferenze

Per ricevere un evento quando una preferenza cambia, registra un listener per questo evento:

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue");
        true; // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked");
        true; // Return true if the click is handled.
    }

Leggi il valore della preferenza attuale

PreferenceFragmentCompat nasconde gran parte dei meccanismi coinvolti nel salvataggio e nella lettura delle preferenze. Tuttavia, tutto viene archiviato utilizzando SharedPreferences e puoi leggere questi valori come faresti normalmente con SharedPreferences:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Lo snippet precedente ottiene un'istanza dell'oggetto SharedPreferences predefinito per l'app, accede a tutti i valori archiviati, esegue un loop su di essi e li stampa in Logcat.