Come codificare una schermata delle impostazioni in un'app Android

Cosa starai creando

Il team di progettazione dei materiali di Google fornisce una definizione chiara delle impostazioni della tua app Android:

Le impostazioni dell'app consentono agli utenti di indicare le preferenze su come dovrebbe comportarsi un'app.

Google afferma inoltre che i tuoi utenti dovrebbero navigare nelle impostazioni dell'app sia dalla barra di navigazione laterale che dal menu della barra degli strumenti, con una voce etichettata impostazioni

L'inclusione delle impostazioni nella tua app consente agli utenti di controllare alcune delle funzionalità della tua app. Ciò rende i tuoi utenti felici invece che arrabbiati, perché ora hanno il controllo di come si comporta l'applicazione. 

Si consiglia vivamente di concedere l'accesso alle impostazioni dell'app. Ciò fornirà un'esperienza utente migliore per i tuoi utenti, il che porterà a una migliore recensione sul Google Play Store, che alla fine darà luogo a un numero maggiore di download di app (che aumentano le entrate). 

Presumo che tu debba aver interagito con le impostazioni di un'app sul tuo dispositivo, ad esempio selezionando una suoneria predefinita o controllando la tua privacy sull'app. Quasi tutte le app più popolari che hai scaricato o scaricabili nel Google Play Store includono una schermata delle impostazioni che ti consente di controllare il comportamento dell'applicazione. 

Un esempio di un'app popolare con una schermata delle impostazioni è l'app Chrome per Android di Google. Nella schermata delle impostazioni di questa app, gli utenti possono scegliere il motore di ricerca predefinito, modificare il comportamento delle notifiche, controllare la privacy degli utenti, ecc. Puoi vederlo tu stesso scaricando l'app Chrome dal Google Play Store (se non lo hai già su il tuo dispositivo). Il seguente screenshot proviene dall'app Chrome, visualizzando la schermata delle impostazioni dell'app.

In questo post imparerai come creare una schermata delle impostazioni dell'app da zero e anche come leggere i valori che l'utente ha selezionato dalle impostazioni dell'app. Per un ulteriore bonus, imparerai anche come utilizzare la funzione di modelli Android Studio per avviare rapidamente il tuo progetto con una schermata delle impostazioni. 

Un esempio di progetto (in Kotlin) per questo tutorial può essere trovato sul nostro repository GitHub in modo da poter seguire facilmente.

Prerequisiti

Per poter seguire questo tutorial, avrai bisogno di:

  • Una conoscenza di base di alcune API Android (come ad esempio SharedPreferences)
  • Android Studio 3.0 o versioni successive
  • Plugin Kotlin 1.1.51 o successivo

1. Creare un progetto per Android Studio

Avvia Android Studio e crea un nuovo progetto (puoi chiamarlo SettingsScreenDemo) con un'attività vuota chiamata SettingsActivity. Assicurati di controllare anche il Include il supporto Kotlin casella di controllo. 

2. Creazione di a PreferenceFragment

Per supportare API di livello 11 (Honeycomb) e versioni successive, possiamo utilizzare PreferenceFragment. Questa classe è semplicemente a Frammento che mostra una gerarchia di Preferenza oggetti come liste.

import android.os.Bundle import android.preference.PreferenceFragment import android.support.v7.app.AppCompatActivity class SettingsActivity: AppCompatActivity () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) if (fragmentManager.findFragmentById (android.R.id.content) == null) fragmentManager.beginTransaction () .add (android.R.id.content, SettingsFragment ()). commit () class SettingsFragment: PreferenceFragment () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) addPreferencesFromResource (R.xml.preferences)

Nel codice sopra, abbiamo creato una classe nidificata SettingsFragment dentro SettingsActivity (perché il SetttingsFragment la classe è così piccola). Si noti che la nostra classe SettingsFragment estende il PreferenceFragment superclasse e ha un metodo addPrerenceFromResource dentro onCreate (). In questo metodo, gli abbiamo dato un ID risorsa R.xml.preference della preferenza XML da lanciare - quando il Frammento è caricato Infine, ospitiamo il frammento sull'attività semplicemente usando il FragmentTransaction per aggiungerlo all'interfaccia utente interna onCreate () di SettingsActivity.

3. Creare le nostre preferenze

Crea un file XML e nominalo preferences.xml. Salva questo file all'interno del res / xml directory nel tuo progetto di app. Nota che puoi dare a questo file qualsiasi nome, ma è altamente raccomandato attenersi al nome convenzionale "preferenze". Inoltre, in genere si dovrebbe avere solo un file di questo tipo in un progetto di app.

       

Il nodo root per il nostro preferenze.xml il file dovrebbe essere a elemento. All'interno di questo elemento radice, ora abbiamo il nostro individuo Preferenza. Ecco gli attributi comuni associati a a Preferenza:

  • Android: chiave: questo attributo è usato per ottenere il valore nel SharedPreferences oggetto.
  • Android: titolo: imposta il titolo per Preferenza. Questo è il testo in grassetto.
  • Android: sintesi: imposta il riepilogo per il Preferenza (questo non è richiesto). Questo è il testo sbiadito sotto il titolo.
  • Android: defaultValue: imposta il valore predefinito per Preferenza

Passeremo attraverso ciascuno di essi Preferenza abbiamo definito sopra a breve Si noti che è anche possibile aggiungere o personalizzare un Preferenza tramite l'editor delle preferenze di Android Studio, simile all'editor delle risorse di layout con cui hai già familiarità. Puoi scegliere di aggiungere / modificare il tuo file XML preferito direttamente in modalità "Testo" o utilizzare l'interfaccia utente drag-and-drop in modalità "Progettazione".

Come puoi vedere, in questo editor puoi trascinare e rilasciare qualsiasi Preferenza nella sezione palette (sul lato sinistro). Una volta eliminato, dovresti selezionarlo e modificarne gli attributi nel riquadro degli attributi (sul lato destro) dell'editor. Si noti che per impostazione predefinita, vengono assegnati alcuni attributi da modificare. Per visualizzare o modificare tutti gli attributi associati a un selezionato Preferenza, assicurati di aver cliccato su Visualizza tutti gli attributi link nella parte inferiore del riquadro degli attributi. Questo è molto simile all'editor di layout che già conosci. 

Ora, passiamo attraverso ciascuno dei Preferenza entità che abbiamo. 

Checkbox Preferenza

UN CheckBoxPreference è semplicemente un CheckBox widget incluso nella schermata delle preferenze. Questo Preferenza restituisce il valore "true" se selezionato o "false" in caso contrario. In altre parole, restituisce un valore booleano a seconda dello stato del widget.

Altri attributi che puoi aggiungere a CheckBoxPreference siamo:

  • Android: summaryOff: imposta il riepilogo per il Preferenza in una schermata delle preferenze quando è deselezionata.
  • Android: summaryOn: imposta il riepilogo per il Preferenza in una schermata di preferenza quando è selezionata.
  • Android: disableDependentsState: Lo stato (true per on o false per off) che provoca la disattivazione delle persone dipendenti. Può essere un valore booleano, come "true" o "false".

Passa preferenza

SwitchPreference esegue funzionalità simili a CheckBoxPreference. Fornisce un'opzione selezionabile a due stati ("on" o "off"). Questo utilizza a Interruttore widget che consente all'utente di scorrere verso sinistra ("off") e verso destra ("on"). Questo Preferenza include anche gli attributi descritti per CheckBoxPreference sopra. Inoltre, ha i seguenti attributi:

  • Android: switchTextOff: imposta il testo utilizzato sullo switch stesso quando è nello stato "off". 
  • Android: switchTextOn: imposta il testo utilizzato sull'interruttore stesso quando è nello stato "on". 

Preferenze di modifica del testo

Questo Preferenza, quando si fa clic, mostra una finestra di dialogo per l'utente per inserire un testo di input. Usa il Modifica il testo widget, compresi tutti gli attributi di quel widget con cui hai già familiarità.

Si noti che il valore memorizzato nel file SharedPreferences è una stringa.


Elenco preferito

Questo tipo di Preferenza visualizzerà un elenco di voci in una finestra di dialogo quando viene toccato. Qui puoi specificare una coppia di risorse di array di stringhe nel tuo XML di preferenza. Questa risorsa array di stringhe contiene semplicemente una raccolta di stringhe. Questa risorsa si trova a res / valori / arrays.xml.

   15 minuti 30 minuti 1 ora 3 ore 6 ore Mai   15 30 60 180 360 -1  

Ecco il nostro esempio ListPreference usando questa risorsa. 

Impostiamo le voci e i valori di entrata usando il Android: le voci e Android: entryValues attributi rispettivamente.

  • Android: le voci: la matrice leggibile dall'uomo da presentare come elenco.
  • Android: entryValues: la matrice per trovare il valore da salvare per una preferenza quando viene selezionata una voce dalle voci.

Ad esempio, se utilizziamo il numero di minuti in ciascuna durata come valori di voce, quando l'utente sceglie una durata (ad esempio 30 minuti), il valore intero corrispondente verrà memorizzato in SharedPreferences (ad esempio 30).

MultiSelect Elenco preferenze

Questo è simile a ListPreference ma invece di avere pulsanti radio, abbiamo le caselle di controllo. In altre parole, l'utente può selezionare più elementi nella finestra di dialogo. Si noti che il risultato è memorizzato in un "set di stringhe" nel SharedPreferences. Questo può essere recuperato usando getStringSet ().

Preferenza per suoneria

Quando un RingtonePreference viene toccato, viene visualizzata una finestra di dialogo contenente l'elenco delle suonerie disponibili sul dispositivo o sull'emulatore.

  • Android: showDefault: se il Suoneria standard l'opzione verrà mostrata.
  • Android: showSilent: se a Silenzioso l'opzione verrà mostrata nell'elenco. L'utente può selezionare questa opzione se non desidera riprodurre alcuna suoneria.  

Si noti che il valore memorizzato nel file SharedPreferences per questa preferenza è una stringa speciale. Questa stringa speciale è un URI che punta a a Fornitore di contenuti.

4. Creazione di gruppi di impostazioni

Diventa un problema quando hai una lunga lista di preferenze o impostazioni, perché gli utenti potrebbero avere qualche problema nella scansione o nella comprensione. Per risolvere questo problema, possiamo raggruppare le nostre preferenze. Dai uno sguardo allo screenshot dell'app di Chrome che ti ho mostrato di nuovo all'inizio: noti che raggruppava le preferenze in due categorie: Nozioni di base e Avanzate. Questo rende più facile per l'utente comprendere le preferenze e non rendere l'elenco troppo schiacciante.

Vediamo ora quanto è semplice eseguire questo compito.

   ...   ...  

Semplicemente circondiamo le preferenze che vogliamo raggruppare in a tagga e dai a ciascun gruppo un titolo usando il Android: titolo attributo.

5. Iniziare un intento

Nota che è possibile aprire un'attività semplicemente facendo clic su una voce di preferenza dalla schermata delle impostazioni. Questo può tornare utile quando vuoi aprire una pagina web. Ecco il codice per farlo:

  

Qui, abbiamo aggiunto un elemento all'interno del elemento. 

  • Android: Azione: imposta l'azione per l'Intent (è simile alla chiamata setAction () su un oggetto Intent). 
  • Android: targetClass: imposta la parte della classe del nome del componente (come per la chiamata setComponent () su un oggetto Intent).
  • Android: targetPackage: Imposta la parte del pacchetto del nome del componente.
  • Android: i dati: Imposta i dati da assegnare (come per la chiamata setData () su un oggetto Intent). 

Ad esempio, per aprire una pagina Web è possibile utilizzare quanto segue:

  

6. Associazione del riepilogo delle preferenze al valore selezionato

Vediamo ora come aggiornare il sommario delle preferenze con il valore selezionato dall'utente. 

class SettingsActivity: AppCompatActivity () // ... class SettingsFragment: PreferenceFragment () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) addPreferencesFromResource (R.xml.preferences) bindPreferenceSummaryToValue (findPreference ("ringtone")) bindPreferenceSummaryToValue (findPreference ("text")) bindPreferenceSummaryToValue (findPreference ("elenco")) // ...

In questa classe, abbiamo creato un metodo di supporto chiamato bindPreferenceSummaryToValue (), che si trova all'interno del nostro oggetto compagno, per aggiornare il testo di riepilogo delle preferenze con il valore che l'utente ha selezionato. L'abbiamo superato a Preferenza oggetto come argomento. Il findPreference () restituirà a Preferenza usando il PreferenzaLa chiave di s. 

class SettingsActivity: AppCompatActivity () // ... oggetto companion / ** * Un listener di modifica del valore di preferenza che aggiorna il riepilogo della preferenza * per riflettere il suo nuovo valore. * / private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener preferenza, valore -> val stringValue = value.toString () if (preferenza è ListPreference) // Per le preferenze di elenco, cerca il valore di visualizzazione corretto in // 'entries' della preferenza elenco. val listPreference = preferenza val index = listPreference.findIndexOfValue (stringValue) // Imposta il riepilogo in modo che rifletta il nuovo valore. preference.setSummary (if (index> = 0) listPreference.entries [index] else null) else if (preferenza è RingtonePreference) // Per le preferenze suoneria, cercare il valore di visualizzazione corretto // utilizzando RingtoneManager. if (TextUtils.isEmpty (stringValue)) // I valori vuoti corrispondono a 'silent' (nessuna suoneria). preference.setSummary ("Silent") else val ringtone = RingtoneManager.getRingtone (preference.getContext (), Uri.parse (stringValue)) if (ringtone == null) // Cancella il sommario se si è verificato un errore di ricerca . preference.setSummary (null) else // Imposta il riepilogo in modo che rifletta il nuovo nome // della visualizzazione della suoneria. val name = ringtone.getTitle (preference.getContext ()) preference.setSummary (name) else // Per tutte le altre preferenze, imposta il riepilogo sulla // rappresentazione della stringa semplice del valore. preference.summary = stringValue true private fun bindPreferenceSummaryToValue (preferenza: preferenza) // Imposta il listener in modo che guardi le variazioni di valore. preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener // Attiva immediatamente il listener con il // valore corrente della preferenza. sBindPreferenceSummaryToValueListener.onPreferenceChange (preferenza, PreferenceManager .getDefaultSharedPreferences (preference.context) .getString (preference.key, ""))

Abbiamo una variabile sBindPreferenceSummaryToValueListener questa è un'istanza di Preference.OnPreferenceChangeListener. Questo è semplicemente un listener di modifiche alle preferenze che ci aiuterà ad aggiornare il riepilogo delle preferenze sul valore che l'utente ha selezionato. Controlliamo casi speciali, come quando la preferenza selezionata è a RingtonePreference o a ListPreference. Per questi tipi di preferenze, facciamo una gestione speciale per ottenere la stringa di riepilogo. Se la preferenza non è né (come un EditTextPreference), abbiamo appena impostato il riepilogo sul valore di stringa della preferenza. 

Dentro il bindPreferenceSummaryToValue (), impostiamo l'ascoltatore del cambiamento delle preferenze chiamando onPreferenceChangeListener (in Java, lo è setOnPreferenceChangeListener invece) sul Preferenza oggetto. 

Ora esegui di nuovo il progetto per vedere come funziona!

7. Recupero dei valori delle preferenze

Per iniziare a ricevere i valori delle preferenze per la schermata delle impostazioni, chiamiamo getDefaultSharedPreference () che è dentro il PreferenceManager passare la classe a Contesto oggetto delle preferenze i cui valori sono desiderati. Si noti che otteniamo i valori dall'impostazione predefinita SharedPreferences per la nostra applicazione. 

val prefs = PreferenceManager.getDefaultSharedPreferences (this) prefs.getBoolean ("checkbox", false) .toString () prefs.getString ("ringtone", "") prefs.getString (" text ","") prefs.getString (" lista ","")

Si chiama il metodo getter corrispondente per il tipo che si desidera recuperare il valore da in SharedPreferences. Passa la chiave come primo argomento e il valore predefinito è il secondo argomento. 

8. Bonus: utilizzando i modelli di Android Studio

Ora che hai appreso le API coinvolte per creare una schermata delle impostazioni da zero in Android, ti mostrerò una scorciatoia che renderà più veloce la prossima volta. Puoi scegliere di utilizzare un modello invece di codificare una schermata delle impostazioni da zero. 

Android Studio fornisce modelli di codice che seguono le best practice di progettazione e sviluppo di Android. Questi modelli di codice esistenti (disponibili in Java e Kotlin) possono aiutarti a avviare rapidamente il tuo progetto. È possibile utilizzare uno di questi modelli per creare una schermata delle impostazioni. 

Per utilizzare questa comoda funzionalità per un nuovo progetto, innanzitutto avviare Android Studio.

Immettere il nome dell'applicazione e fare clic su Il prossimo pulsante. Puoi lasciare i valori predefiniti così come sono nel Target dispositivi Android dialogo. 

Clicca il Il prossimo pulsante di nuovo.

Nel Inserisci un'attività al cellulare finestra di dialogo, scorrere verso il basso e selezionare Attività delle impostazioni. Clicca il Il prossimo pulsante dopo. 

Nell'ultima finestra di dialogo, puoi rinominare il nome dell'attività, il nome del layout o il titolo se lo desideri. Infine, fai clic sul finire pulsante per accettare tutte le configurazioni. 

Android Studio ci ha ora aiutato a creare un progetto con un'attività di impostazioni. Veramente cool! Si consiglia vivamente di esplorare il codice generato. 

Puoi anche utilizzare i modelli per un progetto Android Studio già esistente. Semplicemente vai File> Nuovo> Attività> Attività Impostazioni.  

Tieni presente che i modelli inclusi in Android Studio sono adatti per layout semplici e applicazioni di base, ma se vuoi davvero avviare la tua app, potresti prendere in considerazione alcuni dei modelli di app disponibili da Envato Market. 

Sono un enorme risparmio di tempo per gli sviluppatori esperti, aiutandoli a tagliare la barra della creazione di un'app da zero e concentrare i loro talenti invece sulle parti uniche e personalizzate della creazione di una nuova app

Conclusione

In questo tutorial, hai imparato come creare le impostazioni delle app in Android da zero. Abbiamo anche esplorato come utilizzare facilmente e rapidamente i modelli di Studio Android per creare le impostazioni dell'app. 

Consiglio vivamente di verificare le linee guida sulla progettazione dei materiali ufficiali per le impostazioni per ulteriori informazioni su come progettare e utilizzare correttamente le impostazioni in Android. Inoltre, consulta la guida API ufficiale per ulteriori informazioni su altre API per la creazione di un'attività delle impostazioni. 

Per ulteriori informazioni sulla codifica per Android, consulta alcuni dei nostri altri corsi e tutorial qui su Envato Tuts+!