やりたいこと
DataBindingやViewModelを使用しているときに、ビルドすると以下のようなエラーが表示されるのを修正したい。
- 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>