Variable global extender la clase de aplicación
Así que estoy tratando de extender la base.Application
clase y agregue variables miembro para crear variables globales como en esta primera solución del enlace a continuación.
Esto funciona si la variable miembro es un tipo de datos simple como unString
o unBoolean
. Pero, ¿cómo lo haría para un tipo de datos más complejo? En mi caso me gustaría que la variable miembro fuera de tipoHashMap<String, Boolean>
.
Estoy configurando tres variables miembro enonActivityResult()
(un booleano, unString
, y unHashMap<String, Boolean>
), y estoy tratando de acceder a estas variables miembro en elonClick()
método de un botónonClickListener
. Cuando accedo a la cadena y las variables booleanas, sus valores se configuran de manera apropiada. Sin embargo cuando accedo alHashMap<String, Boolean>
variable su valor se establece en '{}', un vacíoHashMap
. Hay algun tipo deSerialization
¿Que tiene que pasar con un tipo de datos complejo?
También he añadido unArrayList<Boolean>
como variable miembro y cuando accedí a esta variable en elonclick()
Método fue configurado correctamente. Posiblemente los HashMaps deben configurarse de manera diferente. No estoy muy seguro de este punto.
En el código a continuación, solo muestro una versión reducida que solo incluye laHashMap
variable miembro
Aquí está la mi subclase deApplication
<code>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; } } </code>
A continuación se presentan los métodosonActivityResult()
yonClick()
en mi mensajeroActivity
. EnonActivityResult()
, Establezco la variable miembro privada de la clase MyApp. En elonClick()
Método, yo llamo el método de acceso.
<code>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); } }); </code>