android.widget.RadioGroup 不能转换为 android.widget.RadioButton

Posted

技术标签:

【中文标题】android.widget.RadioGroup 不能转换为 android.widget.RadioButton【英文标题】:android.widget.RadioGroup cannot be cast to android.widget.RadioButton 【发布时间】:2016-02-10 04:26:36 【问题描述】:

我实用地创建了 5 个单选组,每个组有 4 个单选按钮。当我尝试使用checkedRadioButton 时,模拟器会崩溃?错误是:android.widget.RadioGroup cannot be cast to android.widget.RadioButton。我哪里错了?

这是我的代码:

    radioGroup = new RadioGroup[5];
    answer = new RadioButton[4];
    int i = 0;
    for (Question qn : questions) 
        radioGroup[i] = new RadioGroup(this);
        radioGroup[i].setId(i);
        int j = 0;
        for (Answer an : answers) 
            if (qn.getID() == an.getQuestion_id_answer()) 
                answer[j] = new RadioButton(this);
                answer[j].setText(an.getAnswer());
                answer[j].setId(j);
                radioGroup[i].addView(answer[j]);

                answer[j].setOnClickListener(new View.OnClickListener() 

                    @Override
                    public void onClick(View v) 
                        int checkedRadioButtonId = v.getId();
                        Toast.makeText(getApplicationContext(), "Checkbox" + checkedRadioButtonId + " checked", Toast.LENGTH_SHORT).show();
                        RadioButton checkedRadioButton = (RadioButton) findViewById(checkedRadioButtonId);
                    
                );
                j++;
            
        
        linearLayout.addView(radioGroup[i]);
        i++;
    

【问题讨论】:

从错误中可以明显看出您正在单选按钮中投射单选组,反之亦然, answer[j] = new RadioButton(this);答案[j].setText(an.getAnswer());答案[j].setId(j); radioGroup[i].addView(answer[j]); 好的,但是我需要改变什么来解决这个问题? 【参考方案1】:

您正在以编程方式为RadioGroupRadioButton 视图设置ID

radioGroup[i].setId(i);

分别

answer[j].setId(j);

由于 i 的某些值也可以是 j 的值(例如 i=j=0),因此您有时会分配相同的 id 两次。

findViewById() 方法将返回任何具有匹配 id 的 View,返回的 View 仅在转换为适当的类之后。

现在不小心排队了

RadioButton checkedRadioButton = (RadioButton) findViewById(checkedRadioButtonId);

首先找到请求 id 为“checkedRadioButtonId”的RadioGroup。这会导致崩溃。

解决问题,使用tag属性,例如

radioGroup[i].setTag("rg" + i);answer[j].setTag("rb" + j);

然后你可以通过写得到带有标签“xyz”的个人View

RadioButton checkedRadioButton = (RadioButton) findViewWithTag("xyz");

【讨论】:

是的,你完全正确。但是当我尝试设置无线电组的 ID radioGroup[i].setId("rg" + i); 它说:setId(int) in View cannot be applied to java.lang.String 好吧,我从来没有尝试过以编程方式进行,我只是使用 xml 并在那里我可以编写 android:id="some_name"。当然,这里的“id”必须是“R.id.whatever”,它是一个 int 值:(。我会编辑我的答案 - 谢谢 我不能使用 XML,因为我需要生成 80 个广播组,我不想手动编写它们。 @Alex M. - 是的 - 我不想让你这样做;)请查看我编辑的答案。 如果我用"rb"+j设置标签,那么我将如何通过findViewWithTag("rb" +j)得到它,onCheckedChanged中没有j

以上是关于android.widget.RadioGroup 不能转换为 android.widget.RadioButton的主要内容,如果未能解决你的问题,请参考以下文章