使用视图模型时,不断收到“分类器‘SharedViewModel’没有伴随对象,因此必须在此处初始化”错误

时间:2021-01-05 18:09:21

标签: android kotlin

我的代码中有两个错误。一个是在私有 val sharedView 模型中,我不断收到“分类器 'SharedViewModel' 没有伴随对象,因此必须在此处初始化”。最后,在 question.text = sharedViewmodel.question 和 question.text = sharedViewModel.answer 这两行中,我都得到了“类型不匹配。 必需的: 可编辑! 成立: 字符串?”但是当我尝试将其更改为可编辑时,我会在我的按钮单击侦听器下方为 question/answer.text.toString() 收到错误消息。有人知道如何解决这些问题吗?这是我的代码:

    package com.example.quest

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import com.google.android.material.floatingactionbutton.FloatingActionButton

class SecondActivity : AppCompatActivity() {
    private val sharedViewModel: SharedViewModel by viewModels(SharedViewModel)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val question = findViewById<EditText>(R.id.question)
        val answer = findViewById<EditText>(R.id.answer)

        if(sharedViewModel.question != null) {
            question.text = sharedViewModel.question
        }

        if(sharedViewModel.answer != null) {
            answer.text = sharedViewModel.answer
        }

        findViewById<FloatingActionButton>(R.id.btn3).setOnClickListener {

            sharedViewModel.question = question.text.toString()
            sharedViewModel.answer = answer.text.toString()
            val questiontext = question.text.toString()
            val answertext = answer.text.toString()

            val returnIntent = Intent()
            returnIntent.putExtra("test", questiontext)
            returnIntent.putExtra("test2", answertext)
            setResult(Activity.RESULT_OK, returnIntent)

            finish()
        }
    }

    }

视图模型:

    package com.example.quest

import androidx.lifecycle.ViewModel

class SharedViewModel : ViewModel() {
    var question: String ?= null
    var answer: String ?= null

}

1 个答案:

答案 0 :(得分:0)

只需使用 by viewModels() 而不传递类的名称。当您的 ViewModel 具有空构造函数时,您不需要传递任何内容。

使用 question.text = sharedViewModel.question 代替 question.setText(sharedViewModel.question)。与另一个相同的事情。问题是在 Java 中为 TextView 定义了多个 setText() 方法。 Kotlin 根据其参数类型与 getText() 的返回值匹配的属性创建一个属性,该属性返回一个 Editable 而不是 String。因此,TextView 的属性访问语法仅适用于 Editables 而不是 Strings。