「まずはやってみよう!」
時間を大切にして、のびのびと健康に生きるための情報発信ブログ

【DataBinding】ビルド時に「Could not find accessor XXXXX」というエラーが表示される原因

やりたいこと

DataBindingViewModelを使用しているときに、ビルドすると以下のようなエラーが表示されるのを修正したい。

  • Could not find accessor XXXXX
  • e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
スポンサーリンク

手順

ViewModelのObservableFieldにprivateがついていないかどうか確認しましょう。
privateがついているとXMLから見えなくなります。

class MainViewModel : ViewModel() {
    private val timeText: ObservableField<String> by lazy { // privateつけるとXMLから見えなくなる
        ObservableField<String>()
    }

    fun onClick() {
        timeText.set("time: ${System.currentTimeMillis()}")
    }
}

ソースコード

MainActivity.kt

package katano.kota.databindingpractice

import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import katano.kota.databindingpractice.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by lazy {
        MainViewModel()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        binding.viewmodel = viewModel
    }
}

 

MainViewModel.kt

package katano.kota.databindingpractice

import android.arch.lifecycle.ViewModel
import android.databinding.ObservableField

class MainViewModel : ViewModel() {
    val timeText: ObservableField<String> by lazy {
        ObservableField<String>()
    }

    fun onClick() {
        timeText.set("time: ${System.currentTimeMillis()}")
    }
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="viewmodel"
            type="katano.kota.databindingpractice.MainViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="@{viewmodel.timeText}"/>
    </LinearLayout>

</layout>

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA