web-dev-qa-db-ja.com

バンドルの内容をLogcatに印刷しますか?

すべてのキーの名前を思い出せない場合に、Bundleの内容をLogcatに印刷する簡単な方法はありますか(キー名だけを印刷することもできます)。

61
Quasaur

Bundle#keySet() は機能するはずです。

_for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}
_

そして、オブジェクトを取得したい場合は、 Bundle#get(String key)(これも回答の上部にリンクした同じドキュメントにあります) を使用できます。ただし、一般的なget()呼び出しを使用することに注意してください。

  • オブジェクトを使用しています。単にログに出力する場合は、toString()が呼び出され、すべて問題ありません。ただし、実際にキーのペアを使用する場合は、instanceofチェックを実行して、間違ったメソッドを呼び出さないようにする必要があります。
  • ToStringが呼び出されるので、特別なオブジェクト(ArrayList、特別なSerializable/Parcelableの追加など)がある場合、ほとんどの場合、印刷から有用なものは得られません。
105
A--C

次のようにマップされた値を印刷することにより、より具体的に取得できます。

for (String key : bundle.keySet())
{
    Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
35
Phil

バンドルからストリングへのコンバーター:

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スペース、その他すべてのスペースキーまたは値に含まれているためです。

21

これが質問に正確に答えているわけではないことを理解してください。しかし、Android Studioデバッガーでデバッグ時に、ブレークポイントに達したときにカスタマイズされたオブジェクトのレンダリングを表示します。また、バンドルの場合、ここの他の回答に示されているタイプのコードを取得し、カスタムレンダラーとして適用できます。ダンプをlogcatやコンソールにパイプする必要があります。

(これらの手順はAndroid Studio 3.1.3(2018年6月)...

  1. [ファイル]を選択してから、[設定]メニューオプション/サブオプションを選択します。
  2. 「設定」ダイアログの左側で、「ビルド、実行、展開」、「デバッガー」、「データビュー」、「Javaタイプレンダラー」をドリルダウンして選択します。
  3. ダイアログの右側の「レンダラー名」には、作成しているレンダラーで識別したい名前を入力します。
  4. 「タイプのオブジェクトにレンダラーを適用する」というダイアログの右側に「Android.os.Bundle」と入力します。
  5. ダイアログの右側の「ノードをレンダリングするとき」セクションで、「次の式を使用:」ラジオボタンを選択します。
  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();
  1. 「適用」/「OK」ボタンを押します。

これで、アプリを実行し、Android.os.Bundle型の変数を示すブレークポイントにヒットすると、デバッガーウィンドウの変数セクションに上記のコードから生成された出力が表示されます。

上記で説明した内容を示すスクリーンショットも含めます... screenshot

5

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()

3
Frank

私はpretty-printと呼ばれるライブラリを開発しました。このライブラリは、バンドルの内容をNiceテーブル形式で出力する注釈プロセッサです。チェックしてください https://github.com/NULLPointerGuy/pretty-print

0
Karthik Rk

Kotlinソリューション:

val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
bundleFromNotifications?.keySet()?.forEach{
    Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
}
0
ehivan24