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

Android货币转换器输入正确币种点击按钮崩溃问题求助

问题分析与解决

问题根源

错误日志里的NumberFormatException: For input string: "androidx.appcompat.widget.AppCompatEditText"直接点明了问题:你在代码中调用了EditText对象本身的toString()方法,而非输入框内的文本内容。EditText.toString()返回的是控件的对象描述字符串,不是用户输入的数字文本,将这个字符串转为Float必然会触发格式异常。

原始代码里的这两处是问题核心:

var currencyResult = calculateRate(binding.editTextSingDollar.toString().toFloat(), binding.editTextRate.toString().toFloat())
binding.currencyOutputTextView.text = getString(R.string.display_currency, binding.editTextSingDollar.toString().toFloat(), currencyResult)

你尝试的修改已经修正了部分调用,但需要确保所有获取输入框文本的地方都使用.text.toString(),而非直接调用控件的toString()。

修复后的完整代码

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import edu.singaporetech.travelapp.databinding.ActivityCurrencyConverterBinding

class CurrencyConverterActivity : AppCompatActivity() {

    private lateinit var binding: ActivityCurrencyConverterBinding
    val TAG: String = "CurrencyConverterActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCurrencyConverterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.convertCurrencyButton.setOnClickListener {
            val currencyInput = binding.editTextCurrency.text.toString().trim()
            if (currencyInput == "US Dollars"){
                binding.currencyOutputTextView.visibility = View.VISIBLE
                // 获取输入框文本并做前置校验
                val singDollarText = binding.editTextSingDollar.text.toString().trim()
                val rateText = binding.editTextRate.text.toString().trim()
                
                if (singDollarText.isNotEmpty() && rateText.isNotEmpty()) {
                    try {
                        val singDollarValue = singDollarText.toFloat()
                        val rateValue = rateText.toFloat()
                        val currencyResult = calculateRate(singDollarValue, rateValue)
                        binding.currencyOutputTextView.text = getString(R.string.display_currency, singDollarValue, currencyResult)
                    } catch (e: NumberFormatException) {
                        binding.currencyOutputTextView.text = "请输入有效的数字"
                    }
                } else {
                    binding.currencyOutputTextView.text = "请填写所有数字输入项"
                }
            }else{
                binding.currencyOutputTextView.text = getString(R.string.invalid_currency)
                binding.currencyOutputTextView.visibility = View.VISIBLE
            }
        }
    }

    private fun calculateRate(value: Float, exchangeRate: Float): Float {
        return value * exchangeRate
    }
}

额外优化建议

  • 输入校验增强:除币种校验外,对数字输入框做空值和格式校验,避免用户未输入或输入非数字内容时崩溃。
  • 硬编码优化:将"US Dollars"提取到string资源中,同时用trim()去除输入前后空格,提升容错性。
  • 字符串资源修正:当前display_currency字符串显示逻辑矛盾,建议修改为"%.1f SGD is %.1f US Dollars",符合货币转换的语义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:05:20