Добавить RadioGroup в динамическом LinearLayout - PullRequest
0 голосов
/ 01 мая 2018

Я динамически генерирую радиокнопки для приложения (например, 3 радиокнопки) в LinearLayout, который я называю parentLinearLayout. Проблема в том, что они не идут автоматически в группе, поэтому, если я проверяю кнопку, а затем другую, обе проверяют вместо отмены проверки первой. Итак, я подумал, что мне следует заняться радиогруппой.

Само приложение представляет собой приложение для анкетирования, и на каждый вопрос имеется разное количество возможных ответов. Я создаю из числа радиокнопок количество ответов в виде радиокнопок.

Проблема в том, что я получаю сообщение об ошибке, в котором говорится, что я должен удалить старое представление перед тем, как это сделать, но если я сделаю это, я потеряю сгенерированный линейный вывод: 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 голосов
/ 01 мая 2018

Вы довольно близки, я думаю, просто измените некоторые строки, и вы готовы идти.

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);
}
0 голосов
/ 01 мая 2018

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, а затем выполните итерацию их и добавление их всех одновременно (что не вызывает обратный вызов прямо здесь, потому что кнопки УЖЕ в иерархии и не изменилось).

Если вам нужно вставить что-то , отличное , кроме RadioButton, в качестве прямого потомка вашего RadioGroup, это тема для другого вопроса (это выполнимо, а не автоматически и потребует от вас дополнительной работы ).

0 голосов
/ 01 мая 2018
  1. Вы создаете новый макет во время каждой итерации в цикле.
  2. Раздувая новый вид, вы теряете старый вид
  3. Каждый раз, когда вы используете один и тот же идентификатор 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...