DataBinding вызывает ошибку компилятора Kotlin

У меня есть ветка в 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>

Буду признателен, если вы можете мне помочь.

app:visibleGone. Разместите аннотированный метод @BindingAdapter
Blackbelt 13.11.2018 10:56

Мне любопытно, если это из-за вашего типа переменной, что произойдет, если вы измените boolean на Boolean? Или даже java.lang.Boolean?

Aaron 13.11.2018 10:58

@Blackbelt bitbucket.org/ali-rezaei/tmdb/src/dataBinding/app/src/main/j‌ ava /…, спасибо

Ali 13.11.2018 10:59

@Aaron, у меня такое же сообщение об ошибке.

Ali 13.11.2018 11:02
1
4
1 117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы сделал следующие изменения: Вот

<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

Ali 13.11.2018 11:22

ты построил? Нажмите на другую ветку и пройдите по ссылке

Blackbelt 13.11.2018 11:23

Да, это было связано со сборкой. Теперь я просто получаю макет network_state_item, а не RecyclerView.

Ali 13.11.2018 11:43

попробуйте добавить android:layout_widthandroid:layout_height и android:id в include

Blackbelt 13.11.2018 11:49

Позвольте нам продолжить обсуждение в чате.

Ali 13.11.2018 12:09

У меня была немного другая проблема, вызвавшая эту ошибку. В моей ViewModel у меня был следующий метод:

`fun onSkip() {
    _score.value = (_score.value)?.minus(1)
    nextWord()
}`

Теперь, когда я устанавливал атрибуты onClick в своем xml, я устанавливал их следующим образом:

android:onClick = "@{() -> gameViewModel.onSkip}" 

                 instead of

android:onClick = "@{() -> gameViewModel.onSkip()}"

Обратите внимание, как я забыл использовать круглые скобки в первом методе.

Другие вопросы по теме