Android開発初学者です。現在、DataBindingの学習中です。ボタンが押されたらTextViewのtextを変更するという機能を作成していますが、うまく動作しません。なぜ動作しないのか教えていただきたいです。
該当のソースコード
Layout
xml
1<?xml version="1.0" encoding="utf-8"?> 2<layout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 tools:context=".MainActivity"> 6 7 <data> 8 <variable 9 name="viewmodel" 10 type="com.example.databinding.MainViewModel" /> 11 </data> 12 13 <LinearLayout 14 android:layout_width="match_parent" 15 android:layout_height="match_parent" 16 android:gravity="center" 17 android:orientation="vertical"> 18 19 <TextView 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:layout_marginVertical="8dp" 23 android:text="@{viewmodel.currentRandomFruitName}" 24 android:textSize="40sp" 25 android:textStyle="bold" /> 26 27 <Button 28 android:layout_width="wrap_content" 29 android:layout_height="wrap_content" 30 android:layout_marginVertical="8dp" 31 android:text="ランダムフルーツ" 32 android:onClick="@{() -> viewmodel.onChangeRandomFruitClick()}" 33 /> 34 35 </LinearLayout> 36 37</layout>
MainActivity
kotlin
1class MainActivity : AppCompatActivity() { 2 3 private lateinit var viewModel: MainViewModel 4 private lateinit var binding: ActivityMainBinding 5 private lateinit var repository: MainRepository 6 private lateinit var viewModelFactory: MainViewModelFactory 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 12 repository = MainRepository() 13 viewModelFactory = MainViewModelFactory(repository) 14 viewModel = ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java) 15 16 binding = DataBindingUtil.setContentView(this, R.layout.activity_main) 17 binding.apply { 18 this.viewmodel = viewmodel 19 this.lifecycleOwner = this@MainActivity 20 } 21 } 22}
Repository
kotlin
1class MainRepository { 2 private val fruitNames: List<String> = listOf( 3 "リンゴ", "バナナ", "ぶどう", "みかん" 4 ) 5 6 private val _currentRandomFruitName = MutableLiveData<String>() 7 8 val currentRandomFruitName: LiveData<String> 9 get() = _currentRandomFruitName 10 11 init { 12 _currentRandomFruitName.value = fruitNames.first() 13 } 14 15 fun changeCurrentRandomFruitName() { 16 val random = Random() 17 val nextFruit = fruitNames[random.nextInt(fruitNames.size)] 18 _currentRandomFruitName.value = nextFruit 19 } 20}
ViewModel
kotlin
1class MainViewModel(private val repository: MainRepository): ViewModel() { 2 val currentRandomFruitName: LiveData<String> 3 get() = repository.currentRandomFruitName 4 5 fun onChangeRandomFruitClick() = repository.changeCurrentRandomFruitName() 6}
ViewModelfactory
kotlin
1class MainViewModelFactory(private val repository: MainRepository): ViewModelProvider.Factory { 2 override fun <T : ViewModel?> create(modelClass: Class<T>): T { 3 return MainViewModel(repository) as T 4 } 5}
また、DataBindingというものがどう便利なのか分かりません。DataBindingはどこが便利なのか、Databindingは実際の開発現場で使用されるものなのか、初学者にとって、学習優先度が高いものなのか教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。