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

为何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:06:03