为何将inflate得到的View强转为Button时,创建动态按钮的循环会中断?
问题根本原因
View.inflate(context, resource, root)方法当第三个参数root不为空时,会自动将inflate出的布局添加到root中,此时方法的返回值是root本身,而非你inflate出来的子View- 你传入的root是LinearLayout类型,强转为Button会抛出
ClassCastException,未捕获的异常会直接中断当前代码执行,所以循环仅跑一次就终止 - 不强转时不会触发类型校验异常,你也没有对返回的LinearLayout做任何操作,因此inflate添加按钮的逻辑可以正常执行,循环可以跑完所有答案
解决方法
推荐使用下面的写法,既保留布局参数的正确解析,又能拿到正确的Button实例:
for (answer in answers) { // 第三个参数attachToRoot传false,返回值为inflate出的Button根布局 val answerButton = LayoutInflater.from(requireContext()) .inflate(R.layout.answer_button, binding.answersLinearLayout, false) as Button answerButton.text = answer // 手动将按钮添加到线性布局中 binding.answersLinearLayout.addView(answerButton) }
如果你需要沿用自动添加到父布局的逻辑,可以改用下面的写法:
for (answer in answers) { View.inflate(requireContext(), R.layout.answer_button, binding.answersLinearLayout) // 取最新添加的子View作为当前答案按钮 val answerButton = binding.answersLinearLayout .getChildAt(binding.answersLinearLayout.childCount - 1) as Button answerButton.text = answer }
内容的提问来源于stack exchange,提问作者SmallGrammer
相关产品推荐
相关产品推荐

