Android Studio中Kotlin简化TextView数组赋值的方法咨询
Android Kotlin计算器代码简化方案
问题场景
开发简易计算器,接收输入a、b,计算p=a*b、q=a/b、r=a+b、s=a-b,结果分别显示在id为out1、out2、out3、out4的TextView中。原代码通过数组存储TextView后逐个赋值,尝试简化写法时出现以下报错:
- Line6:
The expression cannot be a selector (occur after a dot) - Line7:
Unresolved reference: text
原可运行代码
// Line1: val res = arrayOf(findViewById<TextView>(R.id.out1), findViewById<TextView>(R.id.out2), findViewById<TextView>(R.id.out3), findViewById<TextView>(R.id.out4)) // Lines 2, 3, 4, 5: res[0].text = String.format("%.2f", p) res[1].text = String.format("%.2f", q) res[2].text = String.format("%.2f", r) res[3].text = String.format("%.2f", s)
尝试的错误简化写法
// Line6: val res = arrayOf(findViewById<TextView>(R.id.[out1, out2, out3, out4])) // Line7: res.text = String.format("%.2f", [p, q, r, s])
错误原因
R.id.[out1, out2, out3, out4]是语法错误:Kotlin不支持通过这种方式批量引用资源ID,必须逐个传入findViewById。res.text无效:res是TextView数组,数组本身没有text属性,且String.format无法直接接收数组作为参数。
可行简化写法
方案一:使用zip配对遍历
通过将TextView数组与结果数组配对,一次性完成赋值,代码更简洁:
// 批量获取TextView val textViews = arrayOf( findViewById<TextView>(R.id.out1), findViewById<TextView>(R.id.out2), findViewById<TextView>(R.id.out3), findViewById<TextView>(R.id.out4) ) // 存储计算结果 val results = arrayOf(p, q, r, s) // 配对后遍历赋值 textViews.zip(results).forEach { (textView, result) -> textView.text = String.format("%.2f", result) }
方案二:更紧凑的配对写法
直接创建TextView与结果的配对数组,省去中间变量:
arrayOf( findViewById<TextView>(R.id.out1) to p, findViewById<TextView>(R.id.out2) to q, findViewById<TextView>(R.id.out3) to r, findViewById<TextView>(R.id.out4) to s ).forEach { (textView, result) -> textView.text = String.format("%.2f", result) }
方案三:使用ViewBinding(推荐)
如果项目启用了ViewBinding,代码会更简洁且类型安全,无需手动调用findViewById:
// 假设布局为activity_calculator.xml,替换为你的布局名 val binding = ActivityCalculatorBinding.inflate(layoutInflater) setContentView(binding.root) // 直接通过binding获取TextView,配对结果后赋值 arrayOf( binding.out1 to p, binding.out2 to q, binding.out3 to r, binding.out4 to s ).forEach { (textView, result) -> textView.text = String.format("%.2f", result) }
内容的提问来源于stack exchange,提问作者Srinath Lakshman
相关产品推荐
相关产品推荐

