Existe-t-il un moyen simple d’imprimer le contenu d’une Bundle
dans Logcat si vous ne vous souvenez pas des noms de toutes les clés (même pouvoir imprimer uniquement les noms de clé serait bien)?
Bundle # keySet () devrait fonctionner.
for (String key: bundle.keySet())
{
Log.d ("myApplication", key + " is a key in the bundle");
}
Et si vous voulez obtenir l’objet, vous pouvez utiliser Bundle#get(String key)
(qui se trouve également dans la même documentation que celle que j’ai liée en haut de ma réponse) . Cependant, gardez à l'esprit l'utilisation de l'appel générique get()
:
toString()
sera invoqué et tout ira bien. Toutefois, si vous souhaitez réellement utiliser la paire de clés, vous devez effectuer des contrôles instanceof
pour éviter d'appeler la mauvaise méthode.Vous pouvez obtenir plus de détails en imprimant la valeur mappée comme suit:
for (String key : bundle.keySet())
{
Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
Convertisseur de paquet en chaîne:
public static String bundle2string(Bundle bundle) {
if (bundle == null) {
return null;
}
String string = "Bundle{";
for (String key : bundle.keySet()) {
string += " " + key + " => " + bundle.get(key) + ";";
}
string += " }Bundle";
return string;
}
Exemple d'utilisation:
Log.d(TAG,"details="+bundle2string(details));
et sortie:
details=Bundle{ RESPONSE_CODE => 5; }Bundle
Notez que les flèches =>
et les points-virgules ;
vous permettent de mentionner des espaces dans les clés et les valeurs. Un espace avant la flèche, un espace après la flèche, aucun espace avant le point-virgule, un espace après le point-virgule, un espace après {
et un espace avant }
; ou des valeurs.
Réalisez que cela ne répond pas exactement à la question, mais je vois beaucoup de développeurs qui essaient de vider le contenu vers logcat/console car ils ne savent pas qu'ils peuvent configurer le débogueur d'Android Studio pour afficher le rendu d'objet personnalisé au vous frappez un point de rupture. Et dans le cas de Bundle, vous pouvez utiliser le type de code indiqué dans les autres réponses ici et l'appliquer en tant que rendu personnalisé, de sorte que vous n'ayez pas besoin de rediriger le vidage vers logcat et/ou la console.
(Ces instructions proviennent de Android Studio 3.1.3 (juin 2018) ...
StringBuilder builder = new StringBuilder(); for (String key : ((Android.os.Bundle)this).keySet()) { Object value = ((Android.os.Bundle)this).get(key); builder.append("["); builder.append(key); builder.append("]=["); builder.append(value); builder.append("]("); builder.append((value != null) ? value.getClass().getSimpleName() : "null"); builder.append("), "); } return builder.toString();
Désormais, lorsque vous exécutez votre application et que vous atteignez un point d'arrêt affichant une variable de type Android.os.Bundle, la sortie générée à partir du code ci-dessus s'affiche dans la section des variables de la fenêtre du débogueur.
Je vais également inclure une capture d'écran, montrant ce que j'ai décrit ci-dessus ...
En Kotlin, récursif lorsqu'il contient des bundles enfants:
/**
* Recursively logs the contents of a [Bundle] for debugging.
*/
fun Bundle.printDebugLog(parentKey: String = "") {
if (keySet().isEmpty()) {
Log.d("printDebugLog", "$parentKey is empty")
} else {
for (key in keySet()) {
val value = this[key]
when (value) {
is Bundle -> value.printDebugLog(key)
is Array<*> -> Log.d("printDebugLog", "$parentKey.$key : ${value.joinToString()}")
else -> Log.d("printDebugLog", "$parentKey.$key : $value")
}
}
}
}
Usage: myBundle.printDebugLog()
J'ai développé une bibliothèque appelée pretty-print
dont le processeur d'annotation imprime le contenu du paquet au format Nice table . Vérifiez-le https://github.com/NULLPointerGuy/pretty-print
Une solution Kotlin:
val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
bundleFromNotifications?.keySet()?.forEach{
Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
}