Android动态生成EditText异常:输入房间数量后未生成对应控件
问题排查:输入房间数量无法生成EditText控件
以下是导致功能失效的核心问题及修复方案:
1. 输入监听的语法错误与变量未定义
原监听代码存在两处致命问题:
- Lambda表达式语法错误:
doOnTextChanged的参数结尾写成了after -,正确应为after ->,语法错误直接导致监听逻辑不执行。 - 使用了未定义的
bed变量,无法获取输入框的实际内容。
修复后的监听代码:
// secondary Bedroom QTY binding.inputBrQty.doOnTextChanged { text, start, count, after -> text?.toString()?.let { input -> if (input.isNotEmpty()) { val qty = input.toInt() if (qty > 0) { CreateLayout(qty, binding.secBr, "Secondary Bedroom ", roomList) } } } }
2. 循环条件错误导致生成数量不足
CreateLayout中的循环条件while (tmp < qty)会导致生成的EditText数量比输入值少1。例如输入3时,tmp从1开始,只会执行2次循环,生成2个控件。
修改循环条件为tmp <= qty,确保输入数量与生成控件数一致:
fun CreateLayout( qty: Int, parent: LinearLayout, textDisplay: String, storage: MutableList<String> ) { // 清空旧控件与存储列表,避免重复叠加 parent.removeAllViews() storage.clear() var tmp = 1 while (tmp <= qty) { val editText = EditText(this) editText.layoutParams = LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) editText.setText(textDisplay + tmp) editText.isVisible = true editText.id = View.generateViewId() parent.addView(editText) storage.add(editText.id.toString()) tmp++ } }
3. 附加优化:避免重复生成控件
每次输入数量变化时,之前生成的EditText不会自动移除,会导致控件叠加。因此在CreateLayout开头添加parent.removeAllViews()和storage.clear(),确保每次生成都是全新的控件列表。
内容的提问来源于stack exchange,提问作者Shane Weber
相关产品推荐
相关产品推荐

