我在一个LinearLayout中调用parentLinearLayout
动态生成应用程序的轻量级按钮(例如:3个radiobuttons)。问题是,他们不会自动进入一个组,所以如果我检查一个按钮然后另一个按钮,则检查而不是取消检查第一个按钮。所以,我以为我应该做一个RadioGroup。
应用程序本身是一个问卷调查应用程序,每个问题都有不同数量的可能答案。我从radiobutton布局创建了答案数量为radiobuttons。
问题是,我收到一个错误,说我应该删除旧视图,但是如果我这样做,我会丢失生成的linearlayout:The specified child already has a parent. You must call removeView() on the child's parent first.
这是我的代码:
public void drawRAnswers(int pst){
int drawables = qmclist.get(pst).getAnswers().size();
RadioGroup l1 = new RadioGroup(this);
for (int i=0;i<drawables;i++){
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View rowView = inflater.inflate(R.layout.radiobutton, null);
// Add the new row before the add field button.
parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount());
rowView.setId(i);
RadioButton rd = (RadioButton) rowView.findViewById(R.id.radiobtn);
l1.addView(rd); <== HERE IS THE PROBLEM
rd.setText(current.getAnswers().get(i).getAns());
}
}
我有什么想法可以解决这个问题?感谢
答案 0 :(得分:2)
R.id.radiobtn
来查找视图并在布局中再次添加相同的视图时,这是不可能的问题。
for (int i=0;i<drawables;i++){
// 1,2
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//
final View rowView = inflater.inflate(R.layout.radiobutton, null);
parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount());
rowView.setId(i);
RadioButton rd = (RadioButton) rowView.findViewById(R.id.radiobtn);
l1.addView(rd); // same view with same id R.id.radiobtn
rd.setText(current.getAnswers().get(i).getAns());
}
解决方案:
public void drawRAnswers(int pst){
int drawables = qmclist.get(pst).getAnswers().size();
// create a radio group as container with direction
RadioGroup l1 = new RadioGroup(this);
l1.setOrientation(LinearLayout.VERTICAL);
for (int i=0;i<drawables;i++){
// create radio button, with id and text
RadioButton rd = new RadioButton(this);
rd.setId(i);
rd.setText(current.getAnswers().get(i).getAns());
// add radio button into group
l1.addView(rd);
}
// finally, add radio group with buttons into parent layout
parentLinearLayout.addView(l1, parentLinearLayout.getChildCount());
}
答案 1 :(得分:1)
你很接近我想改变一些线条你很高兴。
public void drawRAnswers(int pst){
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int drawables = qmclist.get(pst).getAnswers().size();
RadioGroup l1 = new RadioGroup(this);
for (int i=0;i<drawables;i++){
final View rowView = inflater.inflate(R.layout.radiobutton, null);
// Add the new row before the add field button.
RadioButton rd = (RadioButton) rowView.findViewById(R.id.radiobtn);
rd.setText(current.getAnswers().get(i).getAns());
rd.setId(i);
l1.addView(rd);
}
parentLinearLayout.addView(l1, parentLinearLayout.getChildCount());
//or
parentLinearLayout.addView(l1);
}
答案 2 :(得分:1)
RadioGroups
在幕后得到了荣耀的LinearLayouts,这意味着他们可以支持任何孩子,但如果他们是直接子女,则只会在同一“群组”中对待RadioButtons
组。例如:
想象一下这个层次结构:
<RadioGroup> // THIS YOU HAVE IN XML
<RadioButton 1> // ALL THESE YOU CREATE PROGRAMMATICALLY
<RadioButton 2>
<RadioButton 3>
</RadioGroup>
所以您的XML看起来像:
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/your_radio_button"
android:layout_width=“match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- Radio Buttons will be programmatically added here -->
</RadioGroup>
所以...你以编程方式创建所有内容,这很好。你有一个像“......”这样的“循环”。
final RadioGroup group = //find your_radio_button in the layout.
// now iterate
for (Something something : listOfSomethings) {
final RadioButton rb = new RadioButton(context);
rb.setId(View.generateViewId());
rb.setText(something.giveMeTheText());
rb.setLayoutParams(layoutParams); // make these depending what your container for the RadioGroup is.
rb.setOnCheckedChangeListener(your OnCheckedChangeListener);
group.add(rb);
}
如果您需要侦听更改,请明显添加公共CompoundButton.OnCheckedChangeListener
并覆盖:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// do what you need ;)
}
请记住,如果按钮有group.add(rb)
,那么你onCheckedChangeListener
的那一刻就会被触发......如果你把它设置为已选中(我认为即使你没有使用“false”),所以你可能想要延迟监听器的分配,直到你完成向RadioGroup添加按钮然后迭代它们并同时添加它们(这不会触发回调就在那里因为层次结构中的按钮是ALREADY并且没有更改过。)
如果您需要插入其他而不是RadioButton作为您RadioGroup
的直接子项,这是另一个问题的主题(这是可行的,不是自动的,需要您做一些额外的工作)。