无法使用数据绑定从 xml 调用方法 ViewModel
Cannot call method ViewModel from xml with dataBinding
我想开始增加每一秒的计数。当我想使用方法 stopCount()
停止计数器时,我无法通过 xml 中的 OnClick
调用它。
我收到这个错误:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
.
<data>
<variable name="mainViewModel" type="com.ali.mvvm_livedata.MainViewModel"/>
<variable name="count" type="String"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={mainViewModel.liveData}"
android:onClick="@{() -> mainViewModel.stopCount()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@={mainViewModel.liveData}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
</android.support.constraint.ConstraintLayout>
这是我的 ViewModel
class MainViewModel : ViewModel() {
private val timer = Timer()
private lateinit var timmer: TimerTask
val liveData: MutableLiveData<String> = MutableLiveData()
fun getTime(): MutableLiveData<String> {
return liveData
}
fun count() {
var tempCount = 0
timmer = object : TimerTask() {
override fun run() {
tempCount++
Log.i("currentCount", tempCount.toString())
}
}
timer.scheduleAtFixedRate(timmer, 1000, 1000)
}
internal fun stopCount() {
timmer.cancel()
}
MainActivity 代码
@Inject
lateinit var mModelFactory: ViewModelFactory
private lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
mainViewModel = ViewModelProviders.of(this, mModelFactory).get(MainViewModel::class.java)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.mainViewModel = mainViewModel
binding.lifecycleOwner = this
mainViewModel.count()
}
你必须删除内部(fun stopCount 的前面)
我想开始增加每一秒的计数。当我想使用方法 stopCount()
停止计数器时,我无法通过 xml 中的 OnClick
调用它。
我收到这个错误:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
.
<data>
<variable name="mainViewModel" type="com.ali.mvvm_livedata.MainViewModel"/>
<variable name="count" type="String"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={mainViewModel.liveData}"
android:onClick="@{() -> mainViewModel.stopCount()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@={mainViewModel.liveData}"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
</android.support.constraint.ConstraintLayout>
这是我的 ViewModel
class MainViewModel : ViewModel() {
private val timer = Timer()
private lateinit var timmer: TimerTask
val liveData: MutableLiveData<String> = MutableLiveData()
fun getTime(): MutableLiveData<String> {
return liveData
}
fun count() {
var tempCount = 0
timmer = object : TimerTask() {
override fun run() {
tempCount++
Log.i("currentCount", tempCount.toString())
}
}
timer.scheduleAtFixedRate(timmer, 1000, 1000)
}
internal fun stopCount() {
timmer.cancel()
}
MainActivity 代码
@Inject
lateinit var mModelFactory: ViewModelFactory
private lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
mainViewModel = ViewModelProviders.of(this, mModelFactory).get(MainViewModel::class.java)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.mainViewModel = mainViewModel
binding.lifecycleOwner = this
mainViewModel.count()
}
你必须删除内部(fun stopCount 的前面)