You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

艺术记录应用Year输入异常:无法触发数字校验报错问题求助

艺术记录应用年份校验错误问题解决

问题描述

我正在开发一款艺术记录应用,点击保存按钮添加作品时会校验作品名称、艺术家名称、年份三个字段。目前遇到的问题是:无论Year输入框输入什么内容,都无法触发「Year should be number..」的错误提示。通过断点调试发现,传入makeArt函数的year参数是androidx.appcompat.widget.AppCompatEditText控件对象而非输入的文本内容,因此执行year.toInt()时持续报错,导致无法添加艺术作品。

错误输出信息

androidx.appcompat.widget.appcompatedittext{2100e7f vfed..cl. .f...... 143,862-573,952 #7f080202 app:id/yeartext aid=1073741837}

当前ArtViewModel代码片段

private var insertArtMsg = MutableLiveData<Resource<Art>>()
val insertArtMessage : LiveData<Resource<Art>>
    get() = insertArtMsg

// 修复导航bug
fun resetInsertArtMsg() {
    insertArtMsg = MutableLiveData<Resource<Art>>()
}

fun setSelectedImage(url : String) {
    selectedImage.postValue(url)
}

fun deleteArt(art: Art) = viewModelScope.launch {
    repository.deleteArt(art)
}

fun insertArt(art: Art) = viewModelScope.launch {
    repository.insertArt(art)
}

fun makeArt(name : String, artistName:String, year: String) {

    if (name.isEmpty() || artistName.isEmpty() || year.isEmpty() ) {
        insertArtMsg.postValue(Resource.error("Enter name, artist, year", null))
        return
    }
    val yearInt = try {
        year.toInt()
    } catch (e: Exception) {
        e.printStackTrace()
        insertArtMsg.postValue(Resource.error("Year should be number..",null))
        return
    }

    val art = Art(name, artistName, yearInt, selectedImage.value?: "")
    insertArt(art)
    setSelectedImage("")
    insertArtMsg.postValue(Resource.success(art))
}

问题根源

调用makeArt函数时错误地传入了EditText控件实例,而不是控件的文本内容。代码中makeArt期望year是字符串类型的输入文本,但实际传入的是AppCompatEditText对象,导致后续类型转换逻辑完全失效。

修复步骤

  • 找到Activity/Fragment中调用makeArt的代码位置,将传入的EditText控件替换为控件的文本内容:
    错误调用示例:
    // 错误:直接传入EditText控件
    viewModel.makeArt(nameText.text.toString(), artistText.text.toString(), yearText)
    
    修复后正确调用:
    // 正确:获取EditText的文本内容并转为字符串,同时去除首尾空格
    viewModel.makeArt(
        nameText.text.toString().trim(),
        artistText.text.toString().trim(),
        yearText.text.toString().trim()
    )
    
  • 保留makeArt函数中原有的校验逻辑即可,修复参数传入问题后,非数字年份的错误提示会正常触发。

额外提示

  • EditText的text属性返回Editable类型,必须通过toString()转换为字符串后才能作为文本参数使用。
  • 使用trim()处理输入文本,可避免用户输入空格导致的空值校验失效问题。

内容的提问来源于stack exchange,提问作者Berkay Sazak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:10:30