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.