У меня есть ветка в Bitbucket: https://bitbucket.org/ali-rezaei/tmdb/src/dataBinding/
При создании проекта я получаю следующую ошибку Kotlin compiler:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
Ошибка связана с:
app:visibleGone = "@{isLoaded}"
в следующем макете:
<layout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools">
<data>
<variable
name = "isLoaded"
type = "boolean" />
</data>
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".ui.MainActivity">
<android.support.v4.widget.SwipeRefreshLayout
android:id = "@+id/swipe_refresh"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<android.support.v7.widget.RecyclerView
android:id = "@+id/list"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:visibleGone = "@{isLoaded}" />
</android.support.v4.widget.SwipeRefreshLayout>
<include
layout = "@layout/network_state_item"
app:visibleGone = "@{!isLoaded}" />
</FrameLayout>
</layout>
Буду признателен, если вы можете мне помочь.
Мне любопытно, если это из-за вашего типа переменной, что произойдет, если вы измените boolean на Boolean? Или даже java.lang.Boolean?
@Blackbelt bitbucket.org/ali-rezaei/tmdb/src/dataBinding/app/src/main/j ava /…, спасибо
@Aaron, у меня такое же сообщение об ошибке.
Я бы сделал следующие изменения: Вот
<variable
name = "isLoaded"
type = "boolean" />
Вместо того, чтобы передавать boolean, я бы передал экземпляр вашей виртуальной машины
<variable
name = "vm"
type = "com.sample.android.tmdb.ui.MovieViewModel" />
в вашем фрагменте вы делаете
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
mBinding?.setVariable(BR.vm, mViewModel)
mBinding?.setLifecycleOwner(this)
таким образом ваша виртуальная машина подключается к жизненному циклу вашего фрагмента.
Объявить метод
@BindingAdapter("visibleGone")
fun View.visibleGone(visible: Boolean) {
setVisibility(if (visible) View.VISIBLE else View.GONE)
}
объявите переменную LiveData<Boolean> в вашем MovieViewModel и подключите ее к вашему макету. Например.
val loading: LiveData<Boolean>
тогда в вашем макете вы могли бы иметь
<android.support.v7.widget.RecyclerView
android:id = "@+id/list"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:visibleGone = "@{!safeUnbox(vm.loading)}" />
Спасибо, BR.vm не распознается. Я пробовал как import com.android.databinding.library.baseAdapters.BR, так и import com.sample.android.tmdb.BR
ты построил? Нажмите на другую ветку и пройдите по ссылке
Да, это было связано со сборкой. Теперь я просто получаю макет network_state_item, а не RecyclerView.
попробуйте добавить android:layout_widthandroid:layout_height и android:id в include
Позвольте нам продолжить обсуждение в чате.
У меня была немного другая проблема, вызвавшая эту ошибку. В моей ViewModel у меня был следующий метод:
`fun onSkip() {
_score.value = (_score.value)?.minus(1)
nextWord()
}`
Теперь, когда я устанавливал атрибуты onClick в своем xml, я устанавливал их следующим образом:
android:onClick = "@{() -> gameViewModel.onSkip}"
instead of
android:onClick = "@{() -> gameViewModel.onSkip()}"
Обратите внимание, как я забыл использовать круглые скобки в первом методе.
app:visibleGone. Разместите аннотированный метод@BindingAdapter