Не удается вызвать метод ViewModel из xml с привязкой данных

Я хочу начать увеличивать счет с каждым вторым проходом. Когда я хочу остановить счетчик с помощью метода stopCount(), я не могу вызвать его с помощью OnClick в xml.

Я получил эту ошибку:

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()
}

person Ali bana    schedule 24.07.2019    source источник
comment
stackoverflow.com/questions/53166846/   -  person John Joe    schedule 24.07.2019
comment
метод модели представления, который будет вызываться с помощью привязки данных (из xml), должен быть общедоступным.   -  person mahdi shahbazi    schedule 26.07.2019


Ответы (1)


вы должны удалить внутренний (перед забавой stopCount)

person Bc Lee    schedule 25.07.2019