gpt4 book ai didi

android - Android Kotlin中的viewModel

转载 作者:行者123 更新时间:2023-12-03 10:42:39 25 4
gpt4 key购买 nike

我正在尝试使用适用于Android的kotlin了解 View 模型,但遇到了一些困难。我有一个非常简单的虚拟应用程序,该应用程序允许用户递增一个数字,然后将该数字发送到第二个屏幕。然后,第二个屏幕将显示一个介于0和发送号码之间的随机数。

这是问题所在。

我了解如何使用意图将数据从第一页发送到第二页,并且我知道如何在第二页中创建 View 模型。但是,如果我发送意图,然后将viewmodel设置为等于所设置的意图,则它无法正常运行。旋转屏幕将导致重新发送意图,并且 View 模型不维护数据状态(数字重新随机化)。

理想情况下,我只希望能够更新viewModel类来代替发送意图,但是该类的实例是在创建第二页时创建的,因此不起作用。

有任何想法吗?

基于google codelabs“构建我的第一个android应用”教程。

这是我的代码;第一页:

package com.example.patientplatypus.babbysfirstandroidapp

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.View
import android.view.Window
import android.view.WindowManager
import android.widget.Toast

import kotlinx.android.synthetic.main.activity_main.textView
import org.jetbrains.anko.db.PRIMARY_KEY
import org.jetbrains.anko.db.UNIQUE
import org.jetbrains.anko.db.createTable
import android.database.sqlite.SQLiteDatabase
import android.support.v4.content.ContextCompat.startActivity
import com.example.patientplatypus.babbysfirstandroidapp.R.id.textView
import org.jetbrains.anko.db.*
import org.jetbrains.anko.indeterminateProgressDialog

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main);
}

fun toastMe(view: View) {
val myToast = Toast.makeText(this, "Hello Toast!", Toast.LENGTH_SHORT)
myToast.show()
}

fun countMe (view: View) {
Log.d("insideCountMeCheck", "hey you are inside count me!")
val countString = textView.text.toString()
var count: Int = Integer.parseInt(countString)
count++
textView.text = count.toString()
}

fun randomMe (view: View) {
val randomIntent = Intent(this, SecondActivity::class.java)
val countString = textView.text.toString()
val count = Integer.parseInt(countString)
randomIntent.putExtra(SecondActivity.TOTAL_COUNT, count.toString())
startActivity(randomIntent)
}
}

这是我的代码,第二页:
package com.example.patientplatypus.babbysfirstandroidapp

import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.Window
import android.view.WindowManager
import android.widget.Toast
import java.util.*
import kotlinx.android.synthetic.main.activity_second.randomText

class CountViewModel : ViewModel() {
var TOTAL_COUNT = "total_count"
}

class SecondActivity : AppCompatActivity() {

lateinit var countModel: CountViewModel

companion object {
const val TOTAL_COUNT = "total_count"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.setContentView(R.layout.activity_second)
countModel = ViewModelProviders.of(this).get(CountViewModel::class.java)
countModel.TOTAL_COUNT = intent.getStringExtra(TOTAL_COUNT)
displayForRandomNum(countModel.TOTAL_COUNT);
showRandomNumber()

}

fun showRandomNumber() {
val count = countModel.TOTAL_COUNT.toInt()
val random = Random()
var randomInt = 0
if (count > 0) {
randomInt = random.nextInt(count + 1)
}
Log.d("randomFinal", Integer.toString(randomInt))
displayForRandomNum(Integer.toString(randomInt))
}

fun displayForRandomNum(totalCount: String){
randomText.text = totalCount
}
}

最佳答案

方向更改会导致 Activity 被破坏,然后重新创建。这意味着每次旋转都会调用onCreate。最初仍可以使用与启动 Activity 相同的意图。因此,每次旋转屏幕时,intent.getStringExtra(TOTAL_COUNT)都会从启动 Activity 的意图中返回原始值。 ViewModel将通过轮换保留数据。

您的问题是,每次使用意图的原始值覆盖您都是ViewModel的TOTAL_COUNT。您可以做的是先将TOTAL_COUNT值设置为"total_count",然后检查它是否不是onCreate(即已经从意图中设置了该值)。

关于android - Android Kotlin中的viewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48855050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com