すべてのキーの名前を思い出せない場合に、Bundle
の内容をLogcatに印刷する簡単な方法はありますか(キー名だけを印刷することもできます)。
Bundle#keySet() は機能するはずです。
_for (String key: bundle.keySet())
{
Log.d ("myApplication", key + " is a key in the bundle");
}
_
そして、オブジェクトを取得したい場合は、 Bundle#get(String key)
(これも回答の上部にリンクした同じドキュメントにあります) を使用できます。ただし、一般的なget()
呼び出しを使用することに注意してください。
toString()
が呼び出され、すべて問題ありません。ただし、実際にキーのペアを使用する場合は、instanceof
チェックを実行して、間違ったメソッドを呼び出さないようにする必要があります。次のようにマップされた値を印刷することにより、より具体的に取得できます。
for (String key : bundle.keySet())
{
Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
バンドルからストリングへのコンバーター:
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;
}
使用例:
Log.d(TAG,"details="+bundle2string(details));
および出力:
details=Bundle{ RESPONSE_CODE => 5; }Bundle
矢印=>
およびセミコロン;
を使用すると、キーと値にスペースを含めることができます。矢印の前に1スペース、矢印の後に1スペース、セミコロンの前にスペースなし、セミコロンの後に1スペース、{
の後に1スペース、}
の前に1スペース、その他すべてのスペースキーまたは値に含まれているためです。
これが質問に正確に答えているわけではないことを理解してください。しかし、Android Studioデバッガーでデバッグ時に、ブレークポイントに達したときにカスタマイズされたオブジェクトのレンダリングを表示します。また、バンドルの場合、ここの他の回答に示されているタイプのコードを取得し、カスタムレンダラーとして適用できます。ダンプをlogcatやコンソールにパイプする必要があります。
(これらの手順はAndroid Studio 3.1.3(2018年6月)...
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();
これで、アプリを実行し、Android.os.Bundle型の変数を示すブレークポイントにヒットすると、デバッガーウィンドウの変数セクションに上記のコードから生成された出力が表示されます。
Kotlinでは、子バンドルが含まれている場合の再帰的:
_/**
* 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")
}
}
}
}
_
使用法:myBundle.printDebugLog()
私はpretty-print
と呼ばれるライブラリを開発しました。このライブラリは、バンドルの内容をNiceテーブル形式で出力する注釈プロセッサです。チェックしてください https://github.com/NULLPointerGuy/pretty-print
Kotlinソリューション:
val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
bundleFromNotifications?.keySet()?.forEach{
Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
}