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
相关产品推荐
相关产品推荐

