Java 在Android中从XML动态创建小部件时强制关闭

Java 在Android中从XML动态创建小部件时强制关闭,java,android,casting,android-widget,Java,Android,Casting,Android Widget,我正在尝试创建几个单选按钮,并将它们动态添加到一个RadioGroup。当我使用LayoutInflater方法拉入xml并将其添加到当前视图中时,一切都正常。显示正确的单选按钮 但是,当我试图将LayoutInflater.inflate返回到RadioButton的视图(这样我就可以设置文本)时,我得到一个带有java.lang.ClassCastException的强制关闭 for (int i = 0; i < options.length(); i++) { JSONObje

我正在尝试创建几个单选按钮,并将它们动态添加到一个RadioGroup。当我使用LayoutInflater方法拉入xml并将其添加到当前视图中时,一切都正常。显示正确的单选按钮

但是,当我试图将LayoutInflater.inflate返回到RadioButton的视图(这样我就可以设置文本)时,我得到一个带有java.lang.ClassCastException的强制关闭

for (int i = 0; i < options.length(); i++) {
  JSONObject option = options.getJSONObject(i);

  View option_view = vi.inflate(R.layout.poll_option, radio_group, true);
  option_view.setId(i);

  RadioButton rb = (RadioButton) option_view.findViewById(i);

  rb.setText(option.getString("response"));
}
for(int i=0;i
poll_option.xml:

<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
             android:text="RadioButton" 
             android:layout_width="wrap_content" 
             android:layout_height="wrap_content" />

您可能希望使用
findViewById
并在充气视图中找到单选按钮。比如:

RadioButton rb=(RadioButton)选项\u view.findviewbyd(R.id.yourButtonId)


请参见)

您可能希望使用
findViewById
并在充气视图中找到单选按钮。比如:

RadioButton rb=(RadioButton)选项\u view.findviewbyd(R.id.yourButtonId)

请参见)

您想 然后通过findViewById()获取按钮

动态创建按钮时应使用setID(Int)。现在,您可以稍后使用findViewById访问它。

您想访问它吗 然后通过findViewById()获取按钮


动态创建按钮时应使用setID(Int)。现在,您可以稍后使用findViewById访问它。

问题是您没有获得您认为获得的视图<使用提供的根视图调用code>LayoutInflater.inflate()
表示返回给您的视图是该根视图(而不是充气视图)。调用它的方法会使新的单选按钮膨胀并将其附加到组,但返回值(选项视图)是组本身,而不是单个项。由于您需要在将视图附加到组之前对其进行处理,因此我建议使用如下代码(有效):

这段代码我没有测试,但应该非常接近:p


希望有帮助

问题是你没有得到你认为你得到的观点<使用提供的根视图调用code>LayoutInflater.inflate()
表示返回给您的视图是该根视图(而不是充气视图)。调用它的方法会使新的单选按钮膨胀并将其附加到组,但返回值(选项视图)是组本身,而不是单个项。由于您需要在将视图附加到组之前对其进行处理,因此我建议使用如下代码(有效):

这段代码我没有测试,但应该非常接近:p


希望有帮助

我在循环中运行这个,所以要创建的单选按钮数量未知。如果我将和id放入XML中,它会显示一些奇怪的行为,比如选中/取消选中单选按钮。有没有其他方法可以获取当前的单选按钮?RadioButton rb=(RadioButton)option.findViewWithTag(“RadioButton”)--成功了!谢谢你给我指出了正确的方向。事实上。。。那没用。已删除异常,但返回null>。我不明白-您有一个XML布局。它必须有有限数量的单选按钮,除非在膨胀视图后创建新的单选按钮,而事实似乎并非如此。为什么不能为它们分配有意义的ID?“当前单选按钮”可以通过与切换按钮相关联的回调代码来确定,否?我已经更新了上面的代码,以反映我在循环中创建了任意数量的单选按钮。XML布局有一个单选按钮,是的,但我想用它来定义每个按钮的外观。也许我走错了方向。也许我应该完全以编程方式定义每个单选按钮?(我先查看了一下,但不知道如何设置布局宽度/布局高度)。我在循环中运行这个,所以要创建的单选按钮数量未知。如果我将和id放入XML中,它会显示一些奇怪的行为,比如选中/取消选中单选按钮。有没有其他方法可以获取当前的单选按钮?RadioButton rb=(RadioButton)option.findViewWithTag(“RadioButton”)--成功了!谢谢你给我指出了正确的方向。事实上。。。那没用。已删除异常,但返回null>。我不明白-您有一个XML布局。它必须有有限数量的单选按钮,除非在膨胀视图后创建新的单选按钮,而事实似乎并非如此。为什么不能为它们分配有意义的ID?“当前单选按钮”可以通过与切换按钮相关联的回调代码来确定,否?我已经更新了上面的代码,以反映我在循环中创建了任意数量的单选按钮。XML布局有一个单选按钮,是的,但我想用它来定义每个按钮的外观。也许我走错了方向。也许我应该完全以编程方式定义每个单选按钮?(我先查看了一下,但不知道如何设置布局宽度/布局高度)。当我尝试使用(RadioButton)选项\u view.findViewById(id)强制转换时,这也会导致相同的异常;您希望首先获取视图,主要是
view SomeView=findVIewfromId(R.id.poll\u选项)
,然后从该视图获取findViewById(id);我也刚刚意识到你的充气()与它的设想不同。也就是说,假设它是[View.inflate](,int,android.View.ViewGroup)),在创建RB时应该调用setID。我不明白你的意思。你能用一个例子更新你的答案吗?(顺便说一句,我明白你所说的膨胀()调用的意思——我直接使用了LayoutInflater,所以
//I added these for posterity, I'm sure however you get these references is fine
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RadioGroup radio_group = new RadioGroup(this);
//Get the button, rename it, then add it to the group.
for(int i = 0; i < options.length(); i++) {
    JSONObject option = options.getJSONObject(i);

    RadioButton option_view = (RadioButton)vi.inflate(R.layout.poll_option, null);
    option_view.setText(option.getString("response"));

    radio_group.addView(button);
}
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
for (int i = 0; i < options.length(); i++) {
    RadioButton option_view = new RadioButton(this);
    option_view.setText(option.getString("response"));
    radio_group.addView(option_view, params);
}