我正在尝试使用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
。