J'essaie donc d'étendre la classe de base Application
et d'ajouter des variables membres pour créer des variables globales comme dans cette première solution du lien ci-dessous.Variable globale étend la classe d'application
Cela fonctionne si la variable membre est un type de données simple comme un String
ou un Boolean
. Mais comment le feriez-vous pour un type de données plus complexe? Dans mon cas, j'aimerais que la variable membre soit de type HashMap<String, Boolean>
.
Je suis en train de trois variables membres dans onActivityResult()
(un booléen, un String
et un HashMap<String, Boolean>
), et je suis en train d'accéder à ces variables membres dans la méthode onClick()
d'un bouton de onClickListener
. Lorsque j'accède à la chaîne et aux variables booléennes, leurs valeurs sont définies de manière appropriée. Cependant, quand j'accède à la variable HashMap<String, Boolean>
sa valeur est '{}', HashMap
vide. Y a-t-il une sorte de Serialization
qui doit se produire avec un type de données complexe?
J'ai également ajouté un ArrayList<Boolean>
en tant que variable membre et lorsque j'ai accédé à cette variable dans la méthode onclick()
, il a été correctement défini. Peut-être que HashMaps doit être défini différemment. Je ne suis pas trop sûr de ce point.
Dans le code ci-dessous, je montre juste une version simplifiée qui inclut seulement la variable membre HashMap
.
Voici la sous-classe de ma Application
public class MyApp extends Application {
private HashMap<String, Boolean> selectedContacts = null;
public HashMap<String, Boolean> getSelectedContacts() {
return this.selectedContacts;
}
public void setSelectedContacts(HashMap<String, Boolean> sc) {
this.selectedContacts = sc;
}
}
Voici les méthodes onActivityResult()
et onClick()
dans mon messager Activity
. Dans onActivityResult()
, j'ai défini la variable membre privé de la classe MyApp. Dans la méthode onClick()
, j'appelle la méthode accesseur.
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode) {
case R.integer.contact_manager:
if (resultCode == RESULT_CANCELED)
Log.d(getString(R.string.debug_tag), "FAILURE");
if (resultCode == RESULT_OK) {
Log.d(getString(R.string.debug_tag), "SUCCESS");
MyApp appState = ((MyApp)getApplication());
appState.setSelectedContacts((HashMap<String, Boolean>) data.getSerializableExtra("selectedContacts"));
}
break;
}
}
add_contact_button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(Messenger.this, ContactManager.class);
MyApp appState = ((MyApp)getApplication());
HashMap<String, Boolean> sc = appState.getSelectedContacts();
if (sc != null) {
int totalContacts = sc.size();
if(totalContacts > 0) {
Bundle bundle = new Bundle();
bundle.putSerializable("selectedContacts",sc);
i.putExtras(bundle);
}
}
startActivityForResult(i, R.integer.contact_manager);
}
});