View model & view model factory setup
This commit is contained in:
@@ -22,6 +22,8 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.navigation.fragment.navArgs
|
||||
import com.example.android.guesstheword.R
|
||||
@@ -32,6 +34,9 @@ import com.example.android.guesstheword.databinding.ScoreFragmentBinding
|
||||
*/
|
||||
class ScoreFragment : Fragment() {
|
||||
|
||||
private lateinit var viewModel: ScoreViewModel
|
||||
private lateinit var viewModelFactory: ScoreViewModelFactory
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
@@ -46,15 +51,30 @@ class ScoreFragment : Fragment() {
|
||||
false
|
||||
)
|
||||
|
||||
// Get args using by navArgs property delegate
|
||||
val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()
|
||||
binding.scoreText.text = scoreFragmentArgs.score.toString()
|
||||
binding.playAgainButton.setOnClickListener { onPlayAgain() }
|
||||
viewModelFactory = ScoreViewModelFactory(scoreFragmentArgs.score)
|
||||
viewModel = ViewModelProviders.of(this, viewModelFactory)
|
||||
.get(ScoreViewModel::class.java)
|
||||
|
||||
viewModel.score.observe(this, Observer {
|
||||
binding.scoreText.text = getString(R.string.score_format, it)
|
||||
})
|
||||
|
||||
viewModel.eventPlayAgain.observe(this, Observer {
|
||||
if (it) {
|
||||
onPlayAgain()
|
||||
}
|
||||
})
|
||||
|
||||
binding.playAgainButton.setOnClickListener {
|
||||
viewModel.playAgain()
|
||||
}
|
||||
|
||||
return binding.root
|
||||
}
|
||||
|
||||
private fun onPlayAgain() {
|
||||
findNavController().navigate(ScoreFragmentDirections.actionRestart())
|
||||
viewModel.onPlayAgainComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import timber.log.Timber
|
||||
|
||||
class ScoreViewModel(var finalScore: Int): ViewModel() {
|
||||
|
||||
private val _score = MutableLiveData<Int>()
|
||||
val score: LiveData<Int>
|
||||
get() = _score
|
||||
|
||||
|
||||
private val _eventPlayAgain = MutableLiveData<Boolean>()
|
||||
val eventPlayAgain: LiveData<Boolean>
|
||||
get() = _eventPlayAgain
|
||||
|
||||
init {
|
||||
Timber.i("finalScore: $finalScore")
|
||||
_eventPlayAgain.value = false
|
||||
_score.value = finalScore
|
||||
}
|
||||
|
||||
fun playAgain() {
|
||||
_eventPlayAgain.value = true
|
||||
}
|
||||
|
||||
fun onPlayAgainComplete() {
|
||||
_eventPlayAgain.value = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
class ScoreViewModelFactory(private val finalScore: Int) : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
|
||||
// TODO Construct and return the ScoreViewModel
|
||||
}
|
||||
throw IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user