将Bundle的内容打印到Logcat?

Qua*_*aur 62 java android logcat android-bundle

Bundle如果你不记得所有键的名称(甚至只能打印键名称会很酷),是否有一种简单的方法可以将a的内容打印到Logcat?

A--*_*--C 109

Bundle#keySet()应该可以工作.

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}
Run Code Online (Sandbox Code Playgroud)

如果你想获得Object,你可以使用Bundle#get(String key)(这也是我在答案顶部链接的相同文档).但是,请记住使用通用get()调用:

  • 你正在使用Object.如果您只是打印到日志,toString()将被调用,一切都会好的.但是,如果您确实想要使用密钥对,则需要进行instanceof检查以避免调用错误的方法.
  • 由于toString将被调用,如果你有一个特殊的对象(例如ArrayLists,或特殊的Serializable/Parcelable附加组件),你很可能不会从打印输出中获得任何有用的东西.

  • 我认为你的意思是`bundle.keySet()`(因为你的文档链接很好); 否则这是正确的. (2认同)

Phi*_*hil 35

您可以通过打印映射值来获得更具体的信息,如下所示:

for (String key : bundle.keySet())
{
    Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
Run Code Online (Sandbox Code Playgroud)


184*_*615 21

捆绑到字符串转换器:

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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

Log.d(TAG,"details="+bundle2string(details));
Run Code Online (Sandbox Code Playgroud)

并输出:

details=Bundle{ RESPONSE_CODE => 5; }Bundle
Run Code Online (Sandbox Code Playgroud)

请注意,箭头=>和分号;允许您在键和值中提及空格.箭头前面有一个空格,箭头后面有一个空格,分号前没有空格,分号后面有一个空格,后面有{一个空格,前面有一个空格},所有其他空格都在那里,因为它们在键或值中.


Vit*_*aab 9

Kotlin 中简单的 Bundle to String 实现:

val bundleToString = bundle.keySet()
            .joinToString(", ", "{", "}") { key ->
                "$key=${bundle[key]}"
            }
Run Code Online (Sandbox Code Playgroud)

结果示例{id=3, name="Jhon"}


Fra*_*ank 6

在 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()) {
        when (val value = this[key]) {
                is Bundle -> value.printDebugLog(key)
                is Array<*> -> Log.d("printDebugLog", "$parentKey.$key : ${value.joinToString()}")
                else -> Log.d("printDebugLog", "$parentKey.$key : $value")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法: myBundle.printDebugLog()


Adr*_*lli 6

意识到这并不能完全回答问题,但是我看到有开发人员试图将内容转储到logcat /控制台,因为他们不知道他们可以在Android Studio调试器中进行设置,以便在调试时显示自定义的对象渲染。你碰到一个断点。对于Bundle,您可以采用此处其他答案中所示的代码类型,并将其用作自定义渲染器,这样就无需将转储通过管道传输到logcat和/或控制台。

(这些说明来自Android Studio 3.1.3(2018年6月)...

  1. 选择“文件”,然后选择“设置”菜单选项/子选项。
  2. 在左侧的“设置”对话框中,向下钻取并选择“构建,执行,部署”,“调试器”,“数据视图”,“ Java类型渲染器”。
  3. 在对话框的右侧,其中显示“ Renderer name”(渲染器名称),输入您要与正在创建的渲染器标识的名称。
  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();
Run Code Online (Sandbox Code Playgroud)
  1. 按“应用” /“确定”按钮。

现在,当您运行应用程序时,遇到一个断点,该断点显示了一个类型为android.os.Bundle的变量,您将在调试器窗口的variables部分中看到以上代码生成的输出。

我还将包括一个屏幕截图,显示我上面描述的内容... 屏幕截图