2012-04-08 6 views
0

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

Android global variable

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); 

    } 
}); 

Répondre

0

J'ai donc résolu ce problème. Dans la méthode onActivityResult(), j'Itère la HashMap comme ceci:

Iterator<Entry<String, Boolean>> it = sc.entrySet().iterator(); 
while (it.hasNext()) { 
    HashMap.Entry pairs = (HashMap.Entry) it.next(); 
    String contactId = pairs.getKey().toString(); 
    boolean selected = (Boolean) pairs.getValue(); 
    if (selected) { 
    selectedContactsText += getName(contactId) + ", "; 
    Log.d("Messenger", getName(contactId) + " was selected"); 
    Log.d("Messenger", selectedContactsText + " is the text"); 
    } 
    it.remove(); // avoids a ConcurrentModificationException 
} 

Cependant j'ai remarqué la dernière instruction de la boucle while était en fait enlever des éléments du HashMap. J'ai donc commenté cette ligne et tout fonctionne comme prévu.