viewModel in Kotlin Android



我正在尝试使用kotlin for android了解查看模型,并且我遇到了一些困难。我有一个非常简单的虚拟应用程序,该应用程序允许用户增加一个数字,然后将该数字发送到第二个屏幕。然后,第二个屏幕将在0和已发送的号码之间显示一个随机数。

这是问题。

我了解如何使用意图将数据从第一页发送到第二页,并且我知道如何在第二页中制作ViewModel。但是,如果我发送意图,然后将ViewModel设置为等于集合意图,则它无法正常运行。旋转屏幕将导致意图是不满的,并且ViewModel无法维护数据状态(数字重新汇总(。

理想情况下,我希望只能更新视图类,以代替发送意图,但是当创建第二页时,可以创建类的实例,因此不起作用。p>有什么想法?

基于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
    }
}

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

您的问题是,您的覆盖物是每次都有目的的原始值来查看模型的TOTAL_COUNT。您可以做的是检查TOTAL_COUNT值不是"total_count"(意味着它已经从意图设置了(,然后将其设置为onCreate

最新更新