View model & view model factory setup
This commit is contained in:
@@ -22,6 +22,8 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.databinding.DataBindingUtil
|
import androidx.databinding.DataBindingUtil
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProviders
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import com.example.android.guesstheword.R
|
import com.example.android.guesstheword.R
|
||||||
@@ -32,6 +34,9 @@ import com.example.android.guesstheword.databinding.ScoreFragmentBinding
|
|||||||
*/
|
*/
|
||||||
class ScoreFragment : Fragment() {
|
class ScoreFragment : Fragment() {
|
||||||
|
|
||||||
|
private lateinit var viewModel: ScoreViewModel
|
||||||
|
private lateinit var viewModelFactory: ScoreViewModelFactory
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
@@ -46,15 +51,30 @@ class ScoreFragment : Fragment() {
|
|||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get args using by navArgs property delegate
|
|
||||||
val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()
|
val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()
|
||||||
binding.scoreText.text = scoreFragmentArgs.score.toString()
|
viewModelFactory = ScoreViewModelFactory(scoreFragmentArgs.score)
|
||||||
binding.playAgainButton.setOnClickListener { onPlayAgain() }
|
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
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onPlayAgain() {
|
private fun onPlayAgain() {
|
||||||
findNavController().navigate(ScoreFragmentDirections.actionRestart())
|
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