Cómo iterar a través de todos los objetos Bundle
Estoy intentando crear el método del ayudante que iteraría a través de todos los objetos del paquete , de una manera genérica .
Por "genérico" quiero decir:
- ¿Cómo usar las Preferencias Compartidas en MVP sin Dagger y no hacer que Presenter dependa del contexto?
- Quiero borrar el valor de la preferencia compartida
- Ciclo de vida de Android SharedPreference
- Cómo poner / obtener varios JSONObjects a JSONArray?
- Preferencias compartidas - longitud máxima de un solo valor
- No necesita saber los nombres (claves) de los objetos del paquete pasados como parámetro.
- No necesita cambiar si otro miembro (clave) se agregó al Bundle en el futuro.
Hasta ahora, descubro el siguiente esquema para lograr eso:
private void bundleToSharedPreferences(Bundle bundle) { Set<String> keys = bundle.keySet(); for (String key : keys) { Object o = bundle.get(key); if (o.getClass().getName().contentEquals("int")) { // save ints } else if (o.getClass().getName().contentEquals("boolean")) { // save booleans } else if (o.getClass().getName().contentEquals("String")) { // save Strings } else { // etc. } } }
¿Tiene sentido este enfoque?
¿Hay una mejor manera de lograr esto?
- Acceder a las preferencias compartidas a través de las actividades
- Android: Cómo obtener el tiempo de un TimePicker cuando se escribe en
- Escritura de clase Singleton para administrar las compartidas SharedPreferences de Android
- FindPreference devuelve NULL en el prefit nombre pref
- Compartir preferencias o almacenamiento de archivos internos - ¿Algún problema de memoria?
- No se puede cambiar el texto mediante SharedPreferences
- Obtenga el valor de preferencias compartidas de Android en la clase activity / normal
- Cómo burlar una SharedPreferences usando Mockito
Lo haría por reflexión, si lo hiciera en absoluto. Almacene un mapa estático de tal manera que String.class vaya a SharedPreference.putString (), etc. Luego, cuando esté realizando un bucle a través de los elementos, compruebe su clase en el mapa. Si no existe, compruebe la superclase, etc. Eso le dará el método apropiado para llamar o le permitirá saber que el tipo de objeto solicitado no es algo que se puede poner en las preferencias.
Así que el algoritmo básico es:
- Obtener el objeto del paquete
- Obtener su clase
- Ver si la clase está en el mapa
- Si es así, invoca el método especificado para ponerlo en SharedPreferences
- Si no es así, obtenga su superclase y vuelva al paso 3.
- Si obtiene todo el camino hasta java.lang.Object entonces tiene un objeto empaquetado que no puede ser almacenado inmediatamente en SharedPreferences. Dependiendo de las clases que haya golpeado a lo largo del camino, es posible que desee tratar de manejar esto también o simplemente desea registrar el error y seguir adelante. Sin saber por qué está haciendo esto, es imposible adivinar cómo debe reaccionar cuando el método falla. Invariablemente, a menos que tenga control total sobre el paquete y las preferencias, pero si tienes esa cantidad de control no hay necesidad de saltar a través de todos estos aros porque podría ser mucho más sencillo y simplemente definir su propio llaves.
Nota: la reflexión no es rápida y no es la cosa más fácil de codificar y mantener. Si es posible, recomendaría encontrar un método menos genérico que se adapte a su caso de uso.
¿Podría guardar todo como String usando el método toString ()? No sé si los tipos primitivos se asignan a sus equivalentes de Objeto (por ejemplo, int a la clase Integer), pero si lo son, entonces podría ser capaz de hacer algo como esto, en lugar de comprobar laboriosamente cada clase posible.
for (String key : bundle.keySet()) { saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement }
No estoy seguro de si esto funcionaría para sus necesidades, pero estoy tratando de hacer algo similar para convertir un paquete en una cadena JSON ahora mismo.
- Posicionamiento de una imagen dentro de un ImageView con gravedad: arriba
- Android ¿Cómo escuchar los eventos del botón de volumen?