Возможная причина для "Ошибка: невозможно создать привязки вида java.lang.NullPointerException"
Я использую Android Studio для своих проектов Android. Я столкнулся с проблемой при сбое сборки с помощью странной stacktrace, например:
Error:Execution failed for task ':app:compileDevDebugJavaWithJavac'.
java.lang.RuntimeException: failure, see logs for details.
cannot generate view binders java.lang.NullPointerException
at android.databinding.tool.reflection.ModelMethod.isBoxingConversion(ModelMethod.java:155)
at android.databinding.tool.store.SetterStore.isBetterParameter(SetterStore.java:946)
at android.databinding.tool.store.SetterStore.getBestSetter(SetterStore.java:838)
и казалось, что привязка данных сломалась целиком.
Я делал рефакторинг раньше и перемещал классы между пакетами.
Ответы
Ответ 1
В моем случае я полагался на Android Studio при переименовании и перемещении классов между пакетами. Но это не привело к исправлению для XML-макетов макетов, где были ссылки на рефакторированные классы в атрибуте type
элемента variable
в data
.
Таким образом, мое предыдущее значение типа указывало на не существующие файлы и сбой сборки.
Это простая ошибка, но для поиска источника может потребоваться больше времени. Надеюсь, это поможет кому-то.
Ответ 2
Убедитесь, что вы импортируете все классы, на которые вы ссылаетесь, в привязках xml
У меня был код что-то вроде:
android:visible="@{obj instanceof A}"
Я получал ту же ошибку.
Оказывается, что класс A
не был импортирован сверху. Добавление <import type="com.company.A">
решило проблему.
PS android: visible - это специальный адаптер привязки у меня.
Ответ 3
Функция getter для любого экземпляра, который вы ссылаетесь на ваш xml файл, возможно, не была определена, или функция getter может не иметь спецификатора общего доступа.
Ответ 4
Возможно, вы столкнулись с этим вопросом после перехода на Android X. Если это так, и вы уверены, что ваши XML файлы в порядке, но он все еще не работает, вам следует начать поиск библиотек, которые генерируют код.
Библиотеки, которые генерируют код, не могут быть легко преобразованы Jettifyer. Некоторая информация здесь - https://blog.danlew.net/2018/11/14/the-reality-of-migrating-to-androidx/
В моем случае я обновил очевидные, но я все еще что-то упустил. Итак, я пошел в свою ветку разработки (это был не Android X), запустил сборку и закопался в папку сборки, чтобы увидеть все библиотеки, которые генерировали код. После того, как я это сделал, я смог посмотреть на подозреваемых по одному, пока не обнаружил зависимость, которая вызывала эту проблему. Вы можете либо обновить его, либо, в моем случае, удалить его, и эта ошибка была устранена. :)
Ответ 5
Я сталкиваюсь с этой проблемой, когда я определяю переменную вроде этого (Android Studio ничего не предупреждает)
<data>
<variable
name="onGlobalLayoutA"
type="ViewTreeObserver.OnGlobalLayoutListener"/>
<import type="android.view.ViewTreeObserver"/>
</data>
И я решаю это
<data>
<variable
name="onGlobalLayoutA"
type="android.view.ViewTreeObserver.OnGlobalLayoutListener"/>
</data>
Надеюсь, это поможет кому-то.
Ответ 6
В моем случае причина заключалась в том, что я использовал тип для переменной, которая является другим модулем, и этот модуль добавляется как "реализация" в скрипт сборки. Переход на "api" разрешил проблему.
Очевидно, не та же проблема, что и сообщение, отправленное atlascoder, но я упоминаю независимо, может быть, кто-то gits этой статьи с той же проблемой, что и я.
Ответ 7
в моем случае моя проблема заключалась в LongClickListener
что метод для этого слушателя должен был вернуть boolean
но мой метод возвратил void
поэтому, когда я добавил правильный оператор return, он работал просто отлично.
имейте в виду, что если вы используете метод привязки данных, вы должны вернуть правильное значение, иначе выдается ошибка, которая вообще не помогает.
Ответ 8
вероятно, ваш $ JAVA_HOME не установлен. Проверь это