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