![](/img/trans.png)
[英]Android Kotlin - inherit a VIewModel from another ViewModel
[英]viewModel in Kotlin Android
我試圖使用Android的kotlin了解視圖模型,但遇到了一些困難。 我有一個非常簡單的虛擬應用程序,它允許用戶增加一個數字,然后將該數字發送到第二個屏幕。 然后,第二個屏幕將顯示一個介於0和發送號碼之間的隨機數。
這是問題所在。
我了解如何使用意圖將數據從第一頁發送到第二頁,並且我知道如何在第二頁中創建視圖模型。 但是,如果我發送意圖,然后將viewmodel設置為等於所設置的意圖,則它無法正常運行。 旋轉屏幕將導致重新發送意圖,並且視圖模型不維護數據狀態(數字重新隨機化)。
理想情況下,我只希望能夠更新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
}
}
方向更改會導致活動被破壞,然后重新創建。 這意味着onCreate
將在每次旋轉時被調用。 最初仍可以使用與啟動活動相同的意圖。 因此,每次旋轉屏幕時, intent.getStringExtra(TOTAL_COUNT)
都會從啟動活動的意圖中返回原始值。 ViewModel
將通過旋轉保留數據。
您的問題是每次使用意圖的原始值覆蓋您都是ViewModel的TOTAL_COUNT
。 您可以做的是在onCreate
設置之前,檢查TOTAL_COUNT
值是否不是"total_count"
(意味着它已經從意圖中設置了)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.