Динамические формы на 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
?
Ничего себе, это была моя вторая предпосылка, я забыл опубликовать это. Но когда мы это делаем, у нас есть крошечный шанс, что мы будем перекрываться. Я делаю это: 'int id = 12345; for (String option: options) {... radioButton.setText (опция); radio.setId (id + 1); id + = 1; ... ' – EasyasPi
В общем: Есть 2^31 возможных значений, которые могут быть сгенерированы. Когда у вас есть четыре переключателя (в качестве примера), вероятность столкновения составляет около 6 * 2^-31, что меньше 8 * 2^-31 = 2^-29. Поскольку ваш алгоритм работает на реальном оборудовании, вам нужно сравнить это с вероятностью генерируемых там ошибок (перевертывание бит и т. П.). Эта вероятность намного выше, поэтому вам не нужно заботиться о столкновении, создаваемом таким образом. Я знаю, что трудно привыкнуть к этим вычислениям, когда вы запускаете рандомизированные алгоритмы, но это просто реальность. –
В специальном случае: я также остановил использование Random для этого. View имеет специальный статический метод для создания viewIds, который можно использовать здесь очень хорошо: View.generateViewId(). –