Сохраннение данных в ViewModel из одного Activity и перенос этих данных в другой Activity
Суть: Есть два EditText поля в первой Activity, в них пользователь пишет 2 цифры. Чуть ниже этих полей находится кнопка по нажатию которой запускается вторая Activity и появляется toast (всплывающие маленькое сообщение в нижней центральной части экрана) с этими двумя цифрами. Сохранением данных занимается отдельный класс ViewModel. Перепробовал разные методы записи данных, но, предполагаю, что ошибка может быть в другом.
MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var sharedViewModel: SharedViewModel
private lateinit var minNumber: EditText
private lateinit var maxNumber: EditText
private lateinit var startGameButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sharedViewModel = ViewModelProvider(this)[SharedViewModel::class.java]
minNumber = findViewById(R.id.minNumber)
maxNumber = findViewById(R.id.maxNumber)
startGameButton = findViewById(R.id.startGameButton)
startGameButton.setOnClickListener {
val minInput = minNumber.text.toString()
val maxInput = maxNumber.text.toString()
val min = minInput.toIntOrNull()
val max = maxInput.toIntOrNull()
sharedViewModel.setMinValue(min)
sharedViewModel.setMaxValue(max)
val intent = Intent(this, MainActivity2::class.java)
startActivity(intent)
}
}}
SharedViewModel.kt
class SharedViewModel() : ViewModel() {
private val _minValue = MutableStateFlow(0)
val rangeMin: StateFlow<Int> get() = _minValue
private val _maxValue = MutableStateFlow(1)
val rangeMax: StateFlow<Int> get() = _maxValue
fun setMinValue(value: Int) {
_minValue.value = value
}
fun setMaxValue(value: Int) {
_maxValue.value = value
}}
MainActivity2.kt
class MainActivity2 : AppCompatActivity() {
lateinit var sharedViewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
sharedViewModel = ViewModelProvider(this)[SharedViewModel::class.java]
var minNumber = sharedViewModel.rangeMin.value.toString()
var maxNumber = sharedViewModel.rangeMax.value.toString()
if (sharedViewModel.rangeMin != null && sharedViewModel.rangeMax != null) {
Toast.makeText(applicationContext, minNumber + " " + maxNumber, Toast.LENGTH_SHORT).show()}}
Если запустить приложение и сделать как описано выше, то в toast (всплывающем сообщении) отобразятся цифры, установленные по умолчанию (0 1).
Ответы (1 шт):
ViewModel хранится в специальном хранилище, привязанном, обычно, к активити. Т.е. для разных активити будут разные ViewModel, т.к. хранилище не одно.
То, как вы пробуете - сработало бы, если бы вы использовали фрагменты для разных экранов, а не активити. Фрагменты в одной активити живут и хранилище было бы общее (если указать именно хранилище в активити, а не во фрагменте.)
Если хочется прям разные активити вместо фрагментов с общей активити (что, в вашем простом примере представляется излишним) то можете создать своё хранилище ViewModel-ей в Application классе. Краткий и неполный пример с кодом есть в комменте тут: тык