在动态LinearLayout

时间:2018-05-01 18:14:50

标签: java android button radio

我在一个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());
    }
}

我有什么想法可以解决这个问题?感谢

3 个答案:

答案 0 :(得分:2)

  1. 您正在循环中的每次迭代中创建新布局。
  2. 通过虚增新视图,您将丢失旧视图
  3. 每次使用相同的ID R.id.radiobtn来查找视图并在布局中再次添加相同的视图时,这是不可能的问题。
  4. 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的直接子项,这是另一个问题的主题(这是可行的,不是自动的,需要您做一些额外的工作)。