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.

Pubblicitร 

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ร