DataBinding 导致 Kotlin 编译器错误
DataBinding causing a Kotlin compiler error
我在 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>
如果你能帮助我,我将不胜感激。
我要做的改变是:这里
<variable
name="isLoaded"
type="boolean" />
我不会传递 boolean
,而是传递您的 VM 实例
<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)
这样,您的 VM 就连接到片段的生命周期。
声明一个方法
@BindingAdapter("visibleGone")
fun View.visibleGone(visible: Boolean) {
setVisibility(if (visible) View.VISIBLE else View.GONE)
}
在您 MovieViewModel
中声明一个 LiveData<Boolean>
变量并将其连接到您的布局中。例如。
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)}" />
我有一个稍微不同的问题产生了这个错误。
在我的 ViewModel 中,我有以下方法:
`fun onSkip() {
_score.value = (_score.value)?.minus(1)
nextWord()
}`
现在,当我在 xml 中设置 onClick 属性时,我是这样设置的:
android:onClick="@{() -> gameViewModel.onSkip}"
instead of
android:onClick="@{() -> gameViewModel.onSkip()}"
请注意我是如何忘记在第一种方法中使用括号的。
我在 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>
如果你能帮助我,我将不胜感激。
我要做的改变是:这里
<variable
name="isLoaded"
type="boolean" />
我不会传递 boolean
,而是传递您的 VM 实例
<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)
这样,您的 VM 就连接到片段的生命周期。
声明一个方法
@BindingAdapter("visibleGone")
fun View.visibleGone(visible: Boolean) {
setVisibility(if (visible) View.VISIBLE else View.GONE)
}
在您 MovieViewModel
中声明一个 LiveData<Boolean>
变量并将其连接到您的布局中。例如。
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)}" />
我有一个稍微不同的问题产生了这个错误。 在我的 ViewModel 中,我有以下方法:
`fun onSkip() {
_score.value = (_score.value)?.minus(1)
nextWord()
}`
现在,当我在 xml 中设置 onClick 属性时,我是这样设置的:
android:onClick="@{() -> gameViewModel.onSkip}"
instead of
android:onClick="@{() -> gameViewModel.onSkip()}"
请注意我是如何忘记在第一种方法中使用括号的。