Есть ли простой способ напечатать содержимое Bundle
в Logcat, если вы не можете вспомнить имена всех ключей (даже было бы здорово напечатать только названия ключей)?
Печатать содержимое Bundle для Logcat?
Ответ 1
Bundle # keySet() должен работать.
for (String key: bundle.keySet())
{
Log.d ("myApplication", key + " is a key in the bundle");
}
И если вы хотите получить объект, вы можете использовать Bundle#get(String key)
(который также находится в той же документации, что и в верхней части моего ответа). Однако имейте в виду, используя общий вызов get()
:
- Вы работаете с Object. Если вы просто печатаете в журнале, вызывается
toString()
, и все будет в порядке. Однако, если вы действительно хотите использовать пару ключей, вам нужно выполнить проверкиinstanceof
, чтобы избежать вызова неправильного метода. - Так как toString будет вызываться, если у вас есть специальный объект (например, ArrayLists или специальные Serializable/Parcelable extras), вы, скорее всего, не получите ничего полезного из распечатки.
Ответ 2
Вы можете получить более конкретную информацию, напечатав отображаемое значение следующим образом:
for (String key : bundle.keySet())
{
Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\"");
}
Ответ 3
Конвертер Bundle-to-string:
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
Обратите внимание, что стрелки =>
и точки с запятой ;
позволяют указать пробелы в ключах и значениях. Одно пробел перед стрелкой, одно место после стрелки, пробел перед точкой с запятой, одно пробел после полуточки, одно пробел после {
и одно пробел перед }
, и все остальные пробелы есть, потому что они находятся в ключах или значениях.
Ответ 4
Поймите, что это не дает точного ответа на вопрос, но я вижу, что разработчики пытаются выгрузить содержимое в logcat/console, потому что они не знают, что могут настроить в отладчике Android Studio для отображения настраиваемого рендеринга объектов во время отладки, когда Вы попали в точку останова. А в случае с Bundle вы можете взять тип кода, показанный в других ответах здесь, и применить его в качестве пользовательского средства визуализации, чтобы вам не нужно было направлять дамп в logcat и/или консоль.
(Эти инструкции взяты из Android Studio 3.1.3 (июнь 2018 г.)...
- Выберите "Файл", а затем опцию/подраздел меню "Настройки".
- В диалоговом окне "Настройки" в левой части разверните и выберите "Построение, выполнение, развертывание", "Отладчик", "Представления данных", "Средства визуализации типов Java".
- В правой части диалогового окна, где написано "Имя рендерера", введите имя, которое вы хотите отождествить с созданным вами рендерером.
- В правой части диалогового окна, где написано "Применить средство визуализации к объектам типа", введите "android.os.Bundle".
- В правой части диалогового окна в разделе "При рендеринге узла" установите переключатель "Использовать следующее выражение:".
- В текстовом поле ниже введите следующее...
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, вы увидите вывод, сгенерированный из приведенного выше кода, в разделе переменных окна отладчика.
Я также добавлю скриншот, показывающий то, что я описал выше...
Ответ 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()
Ответ 6
Я разработал библиотеку pretty-print
процессор аннотаций которой печатает содержимое пакета в удобном формате таблицы. Проверьте это https://github.com/NULLPointerGuy/pretty-print
Ответ 7
Решение Kotlin:
val bundleFromNotifications: Bundle? = remoteMessage?.toIntent()?.extras
bundleFromNotifications?.keySet()?.forEach{
Log.d(LOG_TAG, it + "=> \"" + bundleFromNotifications.get(it) + "\"")
}
Ответ 8
Решение в Котлине:
fun Bundle.toPrintableString(): String {
val sb = StringBuilder("{")
var isFirst = true
for (key in keySet()) {
if (!isFirst)
sb.append(',')
else
isFirst = false
when (val value = get(key)) {
is Bundle -> sb.append(key).append(':').append(value.toPrintableString())
else -> sb.append(key).append(':').append(value)
//TODO handle special cases if you wish
}
}
sb.append('}')
return sb.toString()
}
Пример:
val bundle = Bundle()
bundle.putString("asd", "qwe")
bundle.putInt("zxc", 123)
Log.d("AppLog", "bundle:${bundle.toPrintableString()}")
Обратите внимание, что он не обрабатывает все возможные типы значений. Вы должны решить, что важно показать и каким образом.