android - 使用视图模型时不断收到“分类器‘SharedViewModel’没有伴随对象,因此必须在此处初始化”错误
问题描述
我的代码中有两个错误。一个是在私有 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
}
解决方案
只需使用by viewModels()
而不传递类的名称。当您的 ViewModel 有一个空的构造函数时,您不需要传递任何东西。
而不是question.text = sharedViewModel.question
,使用question.setText(sharedViewModel.question)
. 与另一个相同。问题是在 Java 中定义的 TextView 有多种setText()
方法。Kotlin 从参数类型与 的返回值匹配的属性中创建一个属性,该属性getText()
返回一个 Editable 而不是 String。所以 TextView 的属性访问语法只适用于 Editables 而不是 Strings。
推荐阅读
- jsonschema - 如何在 json-schema 中扩展具有 1 个参数的对象
- git - 在切换到本地分支并推送不完整之前在 master 分支上意外提交 - 如何还原和合并
- java - 如何从字符串生成器中提取 json 对象?
- java - 使用 OneToOne 关系一次保存两个实体
- html - 如何以与本网站示例相同的方式进行此 div 块转换
- java - Java 正则表达式每次在字符串中找到数字时添加空格
- javafx - 数据未出现在 javafx 上
- c# - 如何使用按钮单击事件创建对象并将它们添加到列表中?
- python - PyQt5 QListView 已停止从 QSqlTableModel 加载条目,我不知道为什么
- bash - 如何使用 bash 命令更改 XAMPP DocumentRoot?