2015-09-10 3 views
3

Динамические формы на Android могут быть очень запутанными, и я столкнулся с этой конкретной ситуацией, когда создаю список опций через RadioGroup с AppCompatRadioButton s, где checkedId не контекстуальный с динамической RadioGroup:RadioGroup onCheckChanged (RadioGroup radioGroup, int checkedId) не работает корректно с динамическими формами

String [] options = new String[] {"Option 1", "Option 2", "Option 3", "Option 4"}; 

private void buildDynamicRadioGroup(){ 
    final LinearLayout linearLayout = new LinearLayout(MyActivity.class); 
    final RadioGroup radioGroup = new RadioGroup(MyActivity.class); 
    for(String option: options){ 
     final AppCompatRadioButton radioButton = new AppCompatRadioButton(MyActivity.class); 
     radioButton.setText(option); 
     radioGroup.addView(radioButton); 
    } 
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      Log.d("Checked Group Count", group.getChildCount()); // this is always 4 
      Log.d("Option Id", checkedId); // this prints correctly the first time    
     } 
    }); 
    linearLayout.addView(radioGroup); 
} 

Это выглядит хорошо для первого вызова buildDynamicRadioGroup(), однако каждое добавление вызова методы (т.е. п> 1) checkedId является отражением общего подсчета AppCompatRadioButton которые были построены путем вызова этого метода, а не фактического checkedId из RadioGroup в вопросе ...

Например: второй вызов метода отпечатков 4 и 6, если 2 выбран элемент в 2 группы с RadioButton, так как есть 6 AppCompatRadioButton с

Кто-нибудь знает, как справиться с этим, поэтому я получаю только checkedId в контексте с RadioGroup?

ответ

1

Просто сегодня у меня была такая же проблема, и вы нашли свой вопрос при поиске решения. Единственное различие заключается в том, что я загружаю RadioButtons из ресурсов XML.

Для меня проблема заключалась в том, что все переключатели имели одинаковый идентификатор. RadioGroup работает с этими идентификаторами при переключении состояний для переключателей.

Я могу решить свою проблему, изменив идентификатор переключателей, прежде чем добавлять их в RadioGroup. Поэтому я просто добавляю случайный положительный ID:

private View createViewForButton(           
     final Context context,            
     final Option radioButton) {           

    final View view =               
     getLayoutInflater(context).inflate(R.layout.form_radiobutton, null); 

    final RadioButton label = (RadioButton) view.findViewById(R.id.label_view);  
    label.setText(radioButton.getValue());         

    makeButtonWorkingInRadioGroup(view);          

    return view;                
}                    

private void makeButtonWorkingInRadioGroup(final View view) {     
    // The radio group requires all RadioButtons to have different IDs to  
    // work correctly. This wouldn't work else as we are loading all   
    // RadioButtons from the same XML file having the same ID definition.  
    view.setId(View.generateViewId());             
}                    

Убедитесь, что идентификаторы, которые вы установили, положительны. С отрицательными идентификаторами его тоже не работает.

+0

Ничего себе, это была моя вторая предпосылка, я забыл опубликовать это. Но когда мы это делаем, у нас есть крошечный шанс, что мы будем перекрываться. Я делаю это: 'int id = 12345; for (String option: options) {... radioButton.setText (опция); radio.setId (id + 1); id + = 1; ... ' – EasyasPi

+0

В общем: Есть 2^31 возможных значений, которые могут быть сгенерированы. Когда у вас есть четыре переключателя (в качестве примера), вероятность столкновения составляет около 6 * 2^-31, что меньше 8 * 2^-31 = 2^-29. Поскольку ваш алгоритм работает на реальном оборудовании, вам нужно сравнить это с вероятностью генерируемых там ошибок (перевертывание бит и т. П.). Эта вероятность намного выше, поэтому вам не нужно заботиться о столкновении, создаваемом таким образом. Я знаю, что трудно привыкнуть к этим вычислениям, когда вы запускаете рандомизированные алгоритмы, но это просто реальность. –

+0

В специальном случае: я также остановил использование Random для этого. View имеет специальный статический метод для создания viewIds, который можно использовать здесь очень хорошо: View.generateViewId(). –

Смежные вопросы