Подтвердить что ты не робот

Печатать содержимое Bundle для Logcat?

Есть ли простой способ напечатать содержимое Bundle в Logcat, если вы не можете вспомнить имена всех ключей (даже было бы здорово напечатать только названия ключей)?

4b9b3361

Ответ 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 г.)...

  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. Нажмите кнопку "Применить"/"ОК".

Теперь, когда вы запустите свое приложение и дойдете до точки останова, которая показывает переменную типа 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()

Ответ 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()}")

Обратите внимание, что он не обрабатывает все возможные типы значений. Вы должны решить, что важно показать и каким образом.