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

Kotlin中TextWatcher触发NumberFormatException问题求助

问题描述

为EditText实现TextWatcher后,执行val h = height.toFloat()时抛出java.lang.NumberFormatException,异常信息显示输入字符串为"interface kotlin.jvm.functions.Function0"。调试发现txt_height!!.text.toString().trim { it <= ' ' }返回了这个异常字符串,而EditText默认值应为"175"。

TextWatcher实现代码

txt_height!!.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
                isExecuteSeekbar = false
            }

            override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
            override fun afterTextChanged(editable: Editable) {

                var height = txt_height!!.text.toString().trim { it <= ' ' }
                if (height.equals(".", ignoreCase = true))
                    txt_height!!.setText("2.0")

                height = txt_height!!.text.toString().trim { it <= ' ' }
                if (!sh!!.check_blank_data(height) && isExecute) {
                    val h = height.toFloat()
                    if (rdo_feet!!.isChecked) {
                        for (k in height_feet_lst.indices) {
                            if (height.equals(height_feet_lst[k], ignoreCase = true)) {
                                pickerFeet!!.selectedItem = k
                                break
                            }
                        }
                    } else {
                        for (k in height_cm_lst.indices) {
                            if (h == height_cm_lst[k].toFloat()) {
                                pickerCM!!.selectedItem = k
                                break
                            }
                        }
                    }
                    saveData()
                }

                isExecuteSeekbar = true
            }
        })

相关使用代码

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initHeight()

        body()
    }

fun initHeight() {
        heightList.clear()
        for (k in 60..240) {
            heightList.add("" + k)
        }
        val st = arrayOfNulls<CharSequence>(heightList.size)
        for (k in heightList.indices) {
            st[k] = "" + heightList[k]
        }
        picker!!.values = st
        picker!!.sideItems = 1
        picker!!.setOnItemSelectedListener { index ->
            txt_height!!.setText(st[index])
            
        }
    }

fun body(){
if (!sh!!.check_blank_data(SharedPreferencesManager.height)) {
            if (rdo_cm!!.isChecked) {
                txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0))
                txt_height!!.setText(SharedPreferencesManager.height.toString())
            } else {
                txt_height!!.filters =
                    arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements))
                txt_height!!.setText(SharedPreferencesManager.height.toString())
            }
        } else {
            if (rdo_cm!!.isChecked) {
                txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0))
                txt_height!!.setText("150")
            } else {
                txt_height!!.filters =
                    arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements))
                txt_height!!.setText("5.0")
            }
        }
}

object SharedPreferencesManager {
    private val ctx: Context
        get() = Application.instance

    private fun createSharedPreferences(): SharedPreferences {
        return ctx.getSharedPreferences(AppUtils.USERS_SHARED_PREF, Context.MODE_PRIVATE)
    }

    private val sharedPreferences by lazy { createSharedPreferences() }

    var height: String
    get() = sharedPreferences.getString(AppUtils.HEIGHT,"")!!
    set(value) = sharedPreferences.edit().putString(AppUtils.HEIGHT, value).apply()
}
错误分析与解决

问题出在body()函数里的SharedPreferencesManager.height.toString()调用上:

  • SharedPreferencesManager.height本身就是String类型,无需额外调用.toString()。但此处的.toString()实际作用于函数引用(大概率是语法或底层调用异常导致),最终返回了函数签名字符串"interface kotlin.jvm.functions.Function0"。

修改后的body()函数:

fun body(){
if (!sh!!.check_blank_data(SharedPreferencesManager.height)) {
            if (rdo_cm!!.isChecked) {
                txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0))
                txt_height!!.setText(SharedPreferencesManager.height) // 移除多余的.toString()
            } else {
                txt_height!!.filters =
                    arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements))
                txt_height!!.setText(SharedPreferencesManager.height) // 移除多余的.toString()
            }
        } else {
            if (rdo_cm!!.isChecked) {
                txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0))
                txt_height!!.setText("150")
            } else {
                txt_height!!.filters =
                    arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements))
                txt_height!!.setText("5.0")
            }
        }
}

额外优化建议:

  • 对height.toFloat()增加异常捕获,避免非法输入导致崩溃:
try {
    val h = height.toFloat()
    // 后续匹配选择器逻辑
} catch (e: NumberFormatException) {
    // 处理非法输入,比如提示用户或重置EditText内容
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:40:58