簡體   English   中英

Android Kotlin中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM