back to top

Gestione dei dati utente in Android Studio

L’archiviazione e la gestione dei dati è un aspetto fondamentale nello sviluppo di applicazioni in generale. Nell’ambito Android esistono tre modalità di gestione dei dati e nella presente lezione vedremo il primo, una struttura conosciuta come Shared Preferences che consente di gestire piccole quantità di dati.

L’oggetto utilizzato in Android a tale scopo è SharedPreferences e tramite esso è possibile gestire informazioni utili per il funzionamento delle applicazioni. Un utilizzo tipico è la gestione delle preferenze dell’utente poichè tramite quest’oggetto i dati vengono salvati sotto forma di coppie nome-valore.

Supponiamo ad esempio che una nostra applicazione contenga un’opzione per impostare il colore di sfondo delle schermate impostato dall’utente. In questo caso l’applicazione dovrebbe essere in grado di memorizzare la scelta dell’utente in modo che ai successivi utilizzi possa automaticamente impostare il colore di sfondo scelto.

Nel prossimo esempio vedremo come utilizzare l’oggetto SharedPreferences per memorizzare e gestire alcuni dati di una nostra applicazione. Avviamo Android Studio e creiamo un nuovo progetto denominato TestDati.

Nella cartella res del progetto creiamo una sottocartella denominata xml e al suo interno un file denominato dati.xml

All’interno del file appena creato inseriamo il seguente codice

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="Sezione 1">
        <CheckBoxPreference
            android:title="Impostazione 1"
            android:defaultValue="false"
            android:summary="Si o No"
            android:key="checkboxPref" />
    </PreferenceCategory>
    <PreferenceCategory android:title="Sezione 2">
        <EditTextPreference
            android:summary="Inserire un testo"
            android:defaultValue=""
            android:title="Testo"
            android:key="editTextPref" />
        <RingtonePreference
            android:summary="Seleziona una suoneria"
            android:title="Suonerie"
            android:key="suoneriePref" />
    </PreferenceCategory>
</PreferenceScreen>

Questo codice corrisponde nel designer alla seguente interfaccia

All’interno della cartella relativa al package dell’applicazione creiamo un nuovo file denominato ImpostazioniActivity.java

All’interno del file inseriamo il seguente codice

package com.example.testdati;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class ImpostazioniActivity extends PreferenceActivity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.dati);
  }}

E’ possibile a questo punto che vi venga segnalato che il metodo addPreferencesFromResource è deprecato. In tal caso non preoccupatevi, per gli scopi della presente lezione è consigliabile utilizzare questa struttura dati. Il motivo della segnalazione è che sono state introdotte altre strutture dati ma è sempre possibile utilizzare SharedPreferences e quindi il metodo addPreferencesFromResource.

Modifichiamo il file AndroidManifest.xml nel modo seguente

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testdati"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.test.testdati.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.test.testdati.ImpostazioniActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action
                    android:name="com.example.testdati.ImpostazioniActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

    </application>

</manifest>

Modifichiamo il file activity_main.xml nel modo seguente

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

  <Button
    android:id="@+id/btnImpostazioni"
    android:text="Carica schermata impostazioni"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickCarica"/>
  
  <Button
    android:id="@+id/btnVisualizzaValori"
    android:text="Visualizza valori impostati"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickVisualizza"/>
  
  <EditText
    android:id="@+id/txtString"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />
  
  <Button
    android:id="@+id/btnModificaValori"
    android:text="Modifica valori"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickModifica"/>


</LinearLayout>

Quindi nella finestra del designer corrispondente a questa activity dovreste vedere qualcosa del genere

L’ultima cosa da fare è modificare il file MainActivity.java nel modo seguente

package com.example.test.testdati;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
}

public void onClickCarica(View view) {
  Intent i = new Intent("com.example.testdati.ImpostazioniActivity");
  startActivity(i);
}}

A questo punto possiamo avviare l’applicazione sull’emulatore. La prima schermata che ci compare è la seguente

Se clicchiamo sul pulsante Carica schermata impostazioni ci viene mostrata invece la schermata relativa alle impostazioni che abbiamo definito

Spuntiamo il checkbox, inseriamo un testo nella relativa casella e selezioniamo una suoneria (io imposto Andromeda)

Per tornare alla prima schermata clicchiamo sul pulsante Back dell’emulatore.

Nel momento in cui si cambia il valore di una delle impostazioni, viene automaticamente creato un file nella cartella data/data/com.example.testdati/shared_prefs dell’emulatore. Per effettuare una verifica passiamo alla modalità di visualizzazione DDMS di Android Studio. Per farlo basta cliccare nella barra dei menù su Tools -> Android -> Android Device Monitor

In tal modo si apre la seguente finestra. Selezioniamo il tab File Explorer e al suo interno possiamo individuare la suddetta cartella contenente un file denominato com.example.test.testdati_preferences.xml

Se estraiamo questo file e visualizziamo il suo contenuto vedremo qualcosa del genere

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="suoneriePref">content://media/internal/audio/media/105</string>
    <boolean name="checkboxPref" value="true" />
    <string name="editTextPref">Testo di prova</string>
</map>

In pratica i valori che abbiamo impostato all’interno dell’app sono stati archiviati in questo file. Se chiudiamo e riavviamo l’applicazione possiamo verificare come i valori delle varie impostazioni rimangano uguali a quelli salvati nel file.

Ricapitolando, all’inizio della lezione abbiamo creato il file dati.xml per gestire alcune impostazioni che una nostra applicazione potrebbe avere. Per consentire al sistema di visualizzare queste preferenze affinchè l’utente possa cambiarle abbiamo creato un’activity che estende la classe base PreferenceActivity e chiama il metodo addPreferencesFromResource sul file dati.xml. La classe PreferenceActivity è un tipo di activity specializzata nel mostrare una gerarchia di preferenze all’utente e memorizzare i valori impostati per esse dall’utente.

Per sfruttare questa funzionalità all’interno delle nostre applicazioni è necessario utilizzare la classe SharedPreferences. Per comprenderne il funzionamento andiamo a completare la nostra applicazione inserendo nel file MainActivity.java il codice per la gestione degli eventi onClick degli altri due pulsanti.

Il file completo è il seguente

package com.example.testdati;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.content.SharedPreferences;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
}

public void onClickCarica(View view) {
  Intent i = new Intent("com.example.testdati.ImpostazioniActivity");
  startActivity(i);
}

public void onClickVisualizza(View view) {
  SharedPreferences appPrefs =
  getSharedPreferences("com.example.testdati_preferences",
  MODE_PRIVATE);
  Toast.makeText(getBaseContext(), appPrefs.getString("editTextPref", ""), 
  Toast.LENGTH_LONG).show();
}
  
public void onClickModifica(View view) {
  SharedPreferences appPrefs =
  getSharedPreferences("com.example.testdati_preferences",
  MODE_PRIVATE);
  SharedPreferences.Editor prefsEditor = appPrefs.edit();
  prefsEditor.putString("editTextPref",
  ((EditText) findViewById(R.id.txtString)).getText().toString());
  prefsEditor.commit();
}
}

Avviamo nuovamente l’applicazione e cliccando sul pulsante ‘Visualizza valori impostati’ verrà mostrato un messaggio contenente il testo correntemente memorizzato nel file testdati_preferences.xml per la view editTextPref

Adesso inseriamo un nuovo testo nell’apposito campo e clicchiamo sul pulsante ‘Modifica valori’

Adesso se clicchiamo nuovamente sul pulsante ‘Visualizza valori impostati’ vedremo il nuovo testo che abbiamo appena inserito (nel mio caso Ciao) che quindi è stato archiviato nel file xml

Nel metodo onClickVisualizza abbiamo utilizzato il metodo getSharedPreferences per ottenere un’istanza della classe SharedPreferences, specificando il nome del file xml contenente i dati (testdati_preferences). Per ottenere il testo associato all’impostazione poi abbiamo utilizzato il metodo getString, passando come parametro la chiave dell’impostazione che volevamo recuperare (editTextPref). La costante MODE_PRIVATE indica che il file può essere aperto solo dall’applicazione che l’ha creato.

Nel metodo onClickModifica invece abbiamo creato un oggetto SharedPreferences.Editor attraverso il metodo edit dell’oggetto SharedPreferences. Per cambiare il valore del testo abbiamo poi utilizzato il metodo putString e per salvare la modifica il metodo commit.

Pubblicitร