2012-04-08 26 views
0

Also versuche ich die Basis Application Klasse zu erweitern und Elementvariablen hinzuzufügen, um globale Variablen wie in dieser ersten Lösung des Links unten zu erstellen.Globale Variable erweitern Anwendungsklasse

Android global variable

Dies funktioniert, wenn die Membervariable ein einfacher Datentyp wie ein String oder Boolean ist. Aber wie würden Sie es für einen komplexeren Datentyp tun? In meinem Fall möchte ich, dass die Elementvariable vom Typ HashMap<String, Boolean> ist.

Ich gründe drei Elementvariablen in onActivityResult() (ein boolean, ein String und ein HashMap<String, Boolean>), und ich versuche, diese Membervariablen in der onClick() Methode eines onClickListener der Schaltfläche zuzugreifen. Wenn ich auf die Variablen string und boolean zugreife, werden ihre Werte entsprechend gesetzt. Wenn ich jedoch auf die Variable HashMap<String, Boolean> zugreife, wird ihr Wert auf '{}' gesetzt, ein leerer HashMap. Gibt es eine Art von Serialization, die mit einem komplexen Datentyp passieren muss?

Ich habe auch eine ArrayList<Boolean> als Member-Variable hinzugefügt und wenn ich auf diese Variable in der onclick()-Methode zugegriffen hat, wurde es richtig eingestellt. Möglicherweise müssen HashMaps anders eingestellt werden. Ich bin mir nicht sicher, ob das so ist.

In dem Code unten zeige ich nur eine abgespeckte Version, die nur die HashMap Elementvariable enthält.

Hier ist die meine Unterklasse von 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; 
    } 
} 

Nachfolgend finden Sie die Methoden onActivityResult() und onClick() in meinem Messenger Activity sind. In onActivityResult() habe ich die private Member-Variable der MyApp-Klasse festgelegt. In der onClick() Methode rufe ich die Accessor-Methode auf.

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

    } 
}); 

Antwort

0

Also habe ich dieses Problem behoben. Im onActivityResult() Methode, ich war wie so durch die HashMap Iterieren:

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 
} 

Allerdings bemerkte ich die letzte Anweisung der while-Schleife war in der Tat Elemente aus den HashMap entfernen. Also habe ich diese Zeile kommentiert und alles funktioniert wie beabsichtigt.