SharedPreferences
SharedPreferences est le moyen le plus simple et le plus rapide de conserver des données dans Android. La création et la récupération de données utilisent l'idiome du dictionnaire clé / valeur. Il y a d'autres choses dans Android qui utilisent cet idiome dans la gestion des données; certains d’entre eux que vous avez déjà vus dans les projets précédents sur lesquels nous avons travaillé (par exemple, Intents and Bundles). Travailler avec les préférences partagées devrait nous sembler très familier.Pour créer un fichier SharedPreferences, nous devons utiliser la méthode getPreferences dans une classe Activity, puis spécifier le mode d'accès du fichier.
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
Selon la documentation Android, nous sommes censés utiliser Context.MODE_PRIVATE car le mode public est déjà obsolète depuis le niveau 17 de l'API. Nous avons ensuite besoin d'un objet Editor pour pouvoir commencer à modifier les données dans le fichier nouvellement créé.
SharedPreferences.Editor editor = sp.edit();
Now we can start putting in some data.edit.putString("name","Gandalf the Grey");
edit.putInt("age", 2019);
SharedPreferences.Editor editor = sp.edit();
Now we can start putting in some data.edit.putString("name","Gandalf the Grey");
edit.putInt("age", 2019);
Le premier paramètre des commandes put est toujours la clé, et le second paramètre est la valeur. Dans l'exemple précédent, «name» et «age» sont les clés et «Gandalf the Gray» et 2019 sont des valeurs, respectivement. Les commandes put, en elles-mêmes, ne sauvegardent pas les données dans le fichier. Nous devons donc utiliser la méthode apply ou commit.
editor.apply();
// or editor.commit();
editor.apply();
// or editor.commit();
La méthode commit ou apply enregistre les informations et les conserve dans un fichier XML. il n'y a que de légères différences entre ces deux méthodes.
n commit: c'est synchrone et renvoie une valeur booléenne, il renvoie true si l'opération d'écriture a réussi.
n Apply: cela enregistre également les données mais ne renvoie aucune valeur. Il est exécuté de manière asynchrone
Remarque
Il n’est pas nécessaire de spécifier un nom de fichier pour le fichier de préférences partagé; le moteur d'exécution Android attribue automatiquement un nom au fichier nouvellement créé. Par convention, le fichier nouvellement créé suit le nom de la classe d'activité d'où getPreferences a été appelé; par exemple, si vous avez appelé getPreferences à partir de MainActivity.java, le nom du fichier de préférences partagé seraMainActivity.xml
Récupérer des données d'un fichier de préférences partagé est aussi simple que de le créer. Pour accéder au fichier de préférence partagé, nous avons utilisé la même syntaxe lorsque nous avons créé le fichier en premier lieu.
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
SharedPreferences sp = getPreferences(CONTEXT.MODE_PRIVATE);
La méthode getPreferences renvoie une instance d'un objet SharedPreferences. La première fois que cette méthode est appelée, elle recherche un fichier XML portant le même nom que l'activité à partir de laquelle la méthode a été appelée. s'il ne trouve pas ce fichier, il sera créé, mais s'il existe déjà, il sera utilisé à la place. Comme nous avons déjà créé le fichier la première fois que nous avons appelé getPreferences, Android ne créera pas de nouveau fichier et ne remplacera pas ce que nous avons créé auparavant. Une fois que nous avons un objet de préférences partagé, nous pouvons en extraire les données.
sp.getString("name", "default value"); sp.getInt("age", 0);
sp.getString("name", "default value"); sp.getInt("age", 0);
Demonstration du Projet
Les détails du projet sont les suivants.
Table 10-2. Project details for SharedPreferences
Application name
|
SharedPreferences
|
Company domain
|
Use your web site, or invent something; remember that this is in reverse DNS notation
|
Project location
|
Use the default
|
Form factor
|
Phone and tablet only
|
Minimum SDK
|
API 23 Marshmallow
|
Type of activity
|
Empty
|
Activity name
|
MainActivity (default)
|
Layout name
|
activity_main (default)
|
Les détails de l'interface utilisateur pour le fichier de présentation principal sont illustrés à la figure 10-1.
Figure 10-1. activity_main layout file
La définition XML correspondante est donnée dans l'extrait 10-1.
Listing 10-1. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ted.sharedpref.MainActivity"
tools:layout_editor_absoluteY="81dp">
<Button
android:id="@+id/btnload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="load"
app:layout_constraintStart_toStartOf="@+id/etlastname"
app:layout_constraintTop_toBottomOf="@+id/etlastname"/>
<Button
android:id="@+id/btnsave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="save"
app:layout_constraintEnd_toEndOf="@+id/etlastname"
app:layout_constraintTop_toBottomOf="@+id/etlastname"/>
<EditText
android:id="@+id/etfirstname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="212dp"
android:layout_marginTop="36dp"
android:ems="10"
android:gravity="center"
android:hint="Last name"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/etlastname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:ems="10"
android:gravity="center"
android:hint="First name"
android:inputType="textPersonName"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etfirstname"/>
<TextView android:id="@+id/textView"
android:layout_width="320dp"
android:layout_height="0dp"
android:layout_marginBottom="146dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etfirstname"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ted.sharedpref.MainActivity"
tools:layout_editor_absoluteY="81dp">
<Button
android:id="@+id/btnload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="load"
app:layout_constraintStart_toStartOf="@+id/etlastname"
app:layout_constraintTop_toBottomOf="@+id/etlastname"/>
<Button
android:id="@+id/btnsave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="save"
app:layout_constraintEnd_toEndOf="@+id/etlastname"
app:layout_constraintTop_toBottomOf="@+id/etlastname"/>
<EditText
android:id="@+id/etfirstname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="212dp"
android:layout_marginTop="36dp"
android:ems="10"
android:gravity="center"
android:hint="Last name"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/etlastname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:ems="10"
android:gravity="center"
android:hint="First name"
android:inputType="textPersonName"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etfirstname"/>
<TextView android:id="@+id/textView"
android:layout_width="320dp"
android:layout_height="0dp"
android:layout_marginBottom="146dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etfirstname"/>
</android.support.constraint.ConstraintLayout>
Data Persistence
Le flux de travail de base pour cette application est la suivante: 1. Saisissez les informations sur le nom et le prénom dans les deux champs de texte (Figure 10-1).2. Lorsque vous cliquez sur le bouton “ENREGISTRER”, extrayez les valeurs de chaîne des champs de texte.Créer un fichier de préférences partagé (s'il en existe un)n Insérez le nom de famille et le prénom dans le fichier pref partagé en utilisant l'une des méthodes put de l'éditeurn Enregistrer les modifications3. Lorsque le bouton "CHARGER" est cliquéRécupérez le fichier de préférences partagé en utilisant la même syntaxe que lors de sa créationRécupérer les données du fichier en utilisant l’une des méthodes getAfficher les données récupérées en définissant l'attribut text d'un objet TextView Le Listing 10-2 montre la classe MainActivity avec les gestionnaires d’événements pliés.
Listing 10-2. MainActivity with Folded Event Handlers
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.
setOnClickListener(new View.
OnClickListener() { ...
}); btnload.
setOnClickListener(new View.
OnClickListener(){ ...
}); }
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnsave = (Button) findViewById(R.id.btnsave);
Button btnload = (Button) findViewById(R.id.btnload);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.setOnClickListener(new View.OnClickListener() { ... });
btnload.setOnClickListener(new View.OnClickListener(){ ... });
}
}
Les références d'objet pour les objets de vue (EditText, TextView et Button) sont toutes définies dans la méthode onCreate. Nous pouvons le faire car les gestionnaires d’événements de nos deux boutons sont créés à l’aide de classes internes (anonymes). C'est également la raison pour laquelle les deux EditTexts et le TextView sont déclarés finaux. Chaque fois qu'une classe interne utilisera une variable membre de sa classe englobante, cette variable doit être déclarée finale.
Listing 10-3. Save Button
btnsave.
setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick
(View view
) {
SharedPreferences sp
= getPreferences
(Context.
MODE_PRIVATE); SharedPreferences.Editor edit = sp.edit();
String lname
= etlastname.
getText().
toString(); String fname
= etfirstname.
getText().
toString();
edit.putString("lname",lname);
edit.putString("fname",fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
btnsave.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
String lname = etlastname.getText().toString();
String fname = etfirstname.getText().toString();
edit.putString("lname",lname);
edit.putString("fname",fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
1. Crée le fichier de préférences partagé, s’il n’existe pas encore.
2. Nous ne pouvons pas enregistrer les données dans le fichier de préférences partagé (pour le moment); nous avons besoin d'un objet d'interface pour cela. Les objets d'édition feront ce travail
3. Récupérer ce que l'utilisateur a tapé sur les objets EditText et les assigner à des variables String
4. Utilisez l'objet d'édition pour conserver les données dans le fichier de préférences partagé.
5. Validez les modifications dans le fichier.
Listing 10-4. Load Button
btnload.
setOnClickListener(new View.
OnClickListener(){
@Override
public void onClick
(View view
) {
SharedPreferences sp
= getPreferences
(Context.
MODE_PRIVATE);
String lname
= sp.
getString("lname",
"na"); String fname
= sp.
getString("fname",
"na"); tv.
setText(String.
format("%s,%s",lname,fname
)); }
});
btnload.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
String lname = sp.getString("lname","na");
String fname = sp.getString("fname","na");
tv.setText(String.format("%s,%s",lname,fname));
}
});
Récupérez l'objet de préférences partagées en y faisant référence. La syntaxe permettant de créer un objet de préférences partagé est la même que celle utilisée pour le récupérer. Android est assez malin pour comprendre que si le fichier n’existe pas, vous voulez le créer et s’il existe, vous voulez le récupérer.Extrayez les données du fichier pref partagé en utilisant l’une des méthodes get; le stocker dans une variable StringDéfinir le texte de l'objet TextView à l'aide des données extraites du fichier pref partagé
Listing 10-5. Complete Code for MainActivity
package com.example.ted.sharedpref;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.
setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick
(View view
) {
SharedPreferences sp
= getPreferences
(Context.
MODE_PRIVATE); SharedPreferences.Editor edit = sp.edit();
String lname
= etlastname.
getText().
toString(); String fname
= etfirstname.
getText().
toString();
edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this, "Saved it", Toast.LENGTH_SHORT).show();
}
});
btnload.
setOnClickListener(new View.
OnClickListener(){
@Override
public void onClick
(View view
) {
SharedPreferences sp
= getPreferences
(Context.
MODE_PRIVATE);
String lname
= sp.
getString("lname",
"na"); String fname
= sp.
getString("fname",
"na"); tv.
setText(String.
format("%s , %s", lname, fname
)); }
});
}
}
package com.example.ted.sharedpref;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnsave = (Button) findViewById(R.id.btnsave);
Button btnload = (Button) findViewById(R.id.btnload);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
String lname = etlastname.getText().toString();
String fname = etfirstname.getText().toString();
edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this, "Saved it", Toast.LENGTH_SHORT).show();
}
});
btnload.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
String lname = sp.getString("lname", "na");
String fname = sp.getString("fname", "na");
tv.setText(String.format("%s , %s", lname, fname));
}
});
}
}
Le fichier XML créé est en toute sécurité rangé dans la mémoire interne du périphérique Android
Vérification du fichier
Si vous voulez regarder et vérifier ce fichier, vous pouvez utiliser l'outil “Android Device Monitor”. Vous pouvez le lancer à partir de la barre de menu principale Outils - Android - Moniteur de périphériques Android (illustré à la figure 10-2).
Figure 10-2. Android Device Monitor
Android Device Monitor est utilisé comme outil de débogage et d'analyse, mais nous allons l'utiliser pour jeter un coup d'œil au fichier de préférences que nous venons de créer. Allez dans l'explorateur de fichiers. À partir de là, accédez au dossier données - données - nom complet du projet, qui dans mon cas est «com.ted.example.sharedpref». Dans ce dossier, vous trouverez un dossier nommé «shared_prefs». Vous y trouverez le fichier «MainActivity.xml» créé par l’application. Vous ne pouvez pas ouvrir le fichier XML à partir d'Android Device Monitor, mais vous pouvez le télécharger sur votre ordinateur en extrayant le fichier à partir de l'appareil (voir la figure 10-3).
Remarque Sur la plate-forme Windows, si vous rencontrez des problèmes lors du lancement d'Android Device Monitor, vous pouvez arrêter AS3, puis le relancer en tant qu'administrateur.
Figure 10-3. Download a file to your PC
Après avoir téléchargé le fichier, vous pouvez utiliser l’outil de montage XML de votre choix.
Listing 10-6. Contents of the XML File
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="fname">James</string>
<string name="lname">Gosling</string>
</map>
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="fname">James</string>
<string name="lname">Gosling</string>
</map>
Remarque
Les fichiers créés à l'aide de getPreferences (Context.MODE_PRIVATE) ne sont accessibles que par l'activité où ils ont été créés. Vous ne pouvez pas accéder à ce fichier à partir d'une autre activité. Si vous devez partager le fichier de préférences d'une activité à une autre, vous devez créer des «Préférences partagées au niveau de l'application».
Niveau d'application SharedPreferences
It’s not difficult to make the shared preferences file available to other activities; the code needed to accomplish this isn’t very different from our previous example.
Figure 10-4. Sequence of events
Dans la figure 10-4, nous utilisons la méthode getSharedPreferences au lieu de getPreferences (comme dans la section précédente). La méthode nécessite deux paramètres: le premier est le nom du fichier et le second est le mode d'accès. Cette méthode recherche un nom de fichier comme spécifié par le premier paramètre. S'il ne trouve pas le fichier, il sera créé pour la première fois.
SharedPreferences sp = getSharedPreferences(filename, Context.MODE);
Ensuite, nous obtenons un objet d'édition en utilisant l'objet de préférences partagé et commençons à mettre des données dans le fichier en utilisant une variante de la commande put. Après cela, nous pouvons enregistrer le fichier.
Editor edit = sp.edit();
edit.putString("name", "Gandalf the grey"); edit.apply();
À ce stade, nous lançons une deuxième activité en créant une intention explicite et en appelant startActivity.Lorsque la deuxième activité est créée, nous pouvons ouvrir le fichier de préférences partagé pour lancer le processus de récupération des données.
SharedPreferences sp = getSharedPreferences(file, Context.MODE_PRIVATE);
String lname = sp.getString("name", "na");
La méthode getSharedPreferences recherche le nom de fichier spécifié dans le premier argument de la méthode. Comme nous avons déjà créé ce fichier dans MainActivity, au lieu d’en créer un nouveau, le fichier existant est ouvert.Nous pouvons explorer cela davantage sur un projet de démonstration. Nous pourrions créer un projet entièrement nouveau, mais étant donné que la différence entre le nouveau projet et le projet précédent sera minime, vous souhaiterez peut-être simplement copier le projet précédent et effectuer quelques modifications mineures. Suivez l’étape suivante pour copier le projet précédent. 1. Fermez tout projet ouvert dans AS3. dans la barre de menus principale Fichier - Fermer le projet2. Utilisez le gestionnaire de fichiers de votre système d'exploitation (Finder pour macOS, Explorer pour Windows) et copiez le dossier SharedPref dans SharedPref2. Si vous avez besoin de l'emplacement du fichier de projet, AS3 l'affiche dans la fenêtre de l'outil Projet (Figure 10-5).
Figure 10-5. Project location
1. Ouvrez le projet à partir de la barre de menus principale Fichier - Ouvrir. Certains avertissements tels que ceux illustrés à la figure 10-6 peuvent s'afficher. Cliquez sur OK
Figure 10-6. Warning
2. Vous devrez modifier certains identifiants dans le nouveau projet. à tout le moins, changez le nom du paquet en sharedpref2. Utilisons les fonctions de refactoring de AS3 pour faciliter ce changement. Mettez en surbrillance le nom du paquet, comme indiqué dans la figure 10-7: cliquez avec le bouton droit sur RefactorRenommer
Figure 10-7. Refactor
3. Certains avertissements seront affichés par AS3 (Figure 10-8); cliquez sur Renommer le package
Figure 10-8. Refactor warning
4. AS3 demandera le nouveau nom du paquet que nous voulons renommer en sharedpref2 (Figure 10-9). Tapez le nouveau nom et cliquez sur Refactor
Figure 10-9. Refactor to new name
5. D'autres avertissements apparaîtront de l'AS3 avant de procéder au refactor (Figure 10-10). Vérifiez le message, puis cliquez sur Do Refactor.
Figure 10-10. Some more warnings
6. AS3 affichera des avertissements. Notre changement de nom a un peu gâché le système de compilation. Cliquez sur Synchroniser maintenant (Figure 10-11) pour résoudre le problème de gradle.
Figure 10-11. Gradle warning
7. Lorsque toutes les erreurs et les avertissements sont installés, nous devons nettoyer le projet. Dans la barre de menus principale, cliquez sur Construire
- Nettoyer le projet.
- Puis reconstruisez le projet en cliquant sur Construire
- Reconstruire le projet7.
L'étape suivante consiste à exécuter le projet dans l'émulateur. Nous devons nous assurer qu’il fonctionne toujours avant d’y apporter des modifications.
8. Créez une deuxième activité vide pour ce projet (Tableau 10-3).
Table 10-3. Details of New Activity
Activity name
|
Second
|
Layout name
|
activity_second (default)
|
Listing 10-7 shows the layout file for the app.
Listing 10-7. activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ted.sharedpref2.Second">
<TextView
android:id="@+id/textView2"
android:layout_width="305dp"
android:layout_height="65dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:layout_editor_absoluteY="97dp"/> </android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ted.sharedpref2.Second">
<TextView
android:id="@+id/textView2"
android:layout_width="305dp"
android:layout_height="65dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:layout_editor_absoluteY="97dp"/> </android.support.constraint.ConstraintLayout>
Figure 10-12. activity_second
Le seul objet de vue de la deuxième activité est un TextView. Nous allons l'utiliser pour afficher le contenu du fichier xml de préférences partagées.Voyons comment créer le fichier partagé à partir de MainActivity.java.
Listing 10-8. Creation of SharedPref File (SAVE Button)
btnsave.
setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick
(View view
) {
String file
= getPackageName
() + "myFile";
SharedPreferences sp
= getSharedPreferences
(file,
Context.
MODE_PRIVATE); SharedPreferences.Editor edit = sp.edit();
String lname
= etlastname.
getText().
toString(); String fname
= etfirstname.
getText().
toString();
edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
btnsave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String file = getPackageName() + "myFile";
SharedPreferences sp = getSharedPreferences(file, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
String lname = etlastname.getText().toString();
String fname = etfirstname.getText().toString();
edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
The file name for a sharedpref should ideally be <package name of project> + <filename>. The getPackage( ) method should return the package name
Pass the file name and the mode to the getSharedPreferences method in order to create the file
Changeons le bouton LOAD. Au lieu d’ouvrir le fichier pref partagé, ouvrons la deuxième activité.
Listing 10-9. Code for LOAD Button
btnload.
setOnClickListener(new View.
OnClickListener(){
@Override
public void onClick
(View view
) {
Intent intent = new Intent(MainActivity.this, Second.class);
startActivity(intent);
}
});
btnload.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, Second.class);
startActivity(intent);
}
});
Nous allons ouvrir le fichier pref partagé à partir de la deuxième activité et nous le ferons avec la méthode onCreate.
Listing 10-10. Complete Code for Second Activity
package com.example.ted.sharedpref2;
import android.content.Context; import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class Second extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView tv = (TextView) findViewById(R.id.textView2);
String file
= getPackageName
() + "myFile";
SharedPreferences sp
= getSharedPreferences
(file,
Context.
MODE_PRIVATE);
String lname
= sp.
getString("lname",
"na"); String fname
= sp.
getString("fname",
"na"); tv.
setText(String.
format("%s , %s", lname, fname
)) ; }
}
package com.example.ted.sharedpref2;
import android.content.Context; import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class Second extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView tv = (TextView) findViewById(R.id.textView2);
String file = getPackageName() + "myFile";
SharedPreferences sp = getSharedPreferences(file, Context.MODE_PRIVATE);
String lname = sp.getString("lname", "na");
String fname = sp.getString("fname", "na");
tv.setText(String.format("%s , %s", lname, fname)) ;
}
}
La liste complète des codes pour MainActivity figure dans le listing 10-11 pour référence.
Listing 10-11. Complete Code for MainActivity
package com.example.ted.sharedpref2;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.
setOnClickListener(new View.
OnClickListener() {
@Override
public void onClick
(View view
) {
String file
= getPackageName
() + "myFile"; SharedPreferences sp
= getSharedPreferences
(file,
Context.
MODE_PRIVATE); SharedPreferences.Editor edit = sp.edit();
String lname
= etlastname.
getText().
toString(); String fname
= etfirstname.
getText().
toString(); edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
btnload.
setOnClickListener (new View.
OnClickListener(){
@Override
public void onClick
(View view
) {
/*
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
String lname = sp.getString("lname", "na");
String fname = sp.getString("fname", "na");
tv.setText(String.format("%s , %s",lname,fname));
*/
Intent intent = new Intent(MainActivity.this, Second.class);
startActivity(intent);
}
});
}
}
package com.example.ted.sharedpref2;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnsave = (Button) findViewById(R.id.btnsave);
Button btnload = (Button) findViewById(R.id.btnload);
final EditText etlastname = (EditText) findViewById(R.id.etlastname);
final EditText etfirstname = (EditText) findViewById(R.id.etfirstname);
final TextView tv = (TextView) findViewById(R.id.textView);
btnsave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String file = getPackageName() + "myFile";
SharedPreferences sp = getSharedPreferences(file, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
String lname = etlastname.getText().toString();
String fname = etfirstname.getText().toString();
edit.putString("lname", lname);
edit.putString("fname", fname);
edit.apply();
Toast.makeText(MainActivity.this,"Saved it",Toast.LENGTH_SHORT).show();
}
});
btnload.setOnClickListener (new View.OnClickListener(){
@Override
public void onClick(View view) {
/*
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
String lname = sp.getString("lname", "na");
String fname = sp.getString("fname", "na");
tv.setText(String.format("%s , %s",lname,fname));
*/
Intent intent = new Intent(MainActivity.this, Second.class);
startActivity(intent);
}
});
}
}
L'utilisation de préférences partagées est le moyen le plus simple et le plus rapide de sauvegarder les données d'application, mais elle présente certaines limites. Vous ne pouvez enregistrer que des types primitifs et des types de chaîne; Si vous devez travailler avec des types de fichiers plus complexes (par exemple, audio, vidéo ou image), vous ne pouvez pas accomplir cela avec les préférences partagées.