问题
I am programatically adding RadioButtons
to a pre-existing but empty RadioGroup
with the following code.
RadioGroup currencySettingRadioGroup = (RadioGroup) currency_settings_dialog.findViewById(R.id.rg_currency_symbol);
currencySettingRadioGroup.removeAllViews();
RadioButton rb_none = new RadioButton(this);
// Add the 'None' option at the start
rb_none.setText("None");
if (v_currency_symbol.equals("")) rb_none.setChecked(true);
currencySettingRadioGroup.addView(rb_none,0);
String[] currency_symbols_options_array = getResources().getStringArray(R.array.currency_symbols);
for ( int i=0; i < currency_symbols_options_array.length; i++ ) {
RadioButton rb = new RadioButton(this);
rb.setText(currency_symbols_options_array[i]);
if (v_currency_symbol.equals(currency_symbols_options_array[i].substring(0,1))) rb.setChecked(true);
currencySettingRadioGroup.addView(rb,i+1);
}
The layout XML is as follows:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/currency_settings_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="12dp"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingTop="24dp">
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/currency_symbol"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/currency_symbol_explanation" />
<RadioGroup
android:id="@+id/rg_currency_symbol"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:id="@+id/settings_close_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:elevation="0dp"
android:gravity="end|center_vertical"
android:text="@string/close_currency_settings"
android:textColor="#008dcd" />
</LinearLayout>
The RadioGroup
gets built correctly and the RadioButton
with the text that matches my v_currency_symbol
variable's first character is checked as expected.
However, clicking any of the other RadioButton
s does not cause the checked option to uncheck - I end up with two options checked.
Clicking and checking any of the other options causes the second checked position to uncheck, but the first RadioButton
remains checked.
It is almost as though the RadioButton
that is checked programatically belongs to a seperate RadioGroup.
Removing the two lines that check one of the RadioButton
s on creation allows the RadioGroup
to function properly, but you obviously cannot then see the previous selection.
回答1:
I found the issue... checking the RadioButton
before adding it to the RadioGroup
causes the problem.
Swapping the two relevant lines resolves the issue. The working code is as follows:
// Add the 'None' option at the start
rb_none.setText("None");
currencySettingRadioGroup.addView(rb_none,0);
if (v_currency_symbol.equals("")) rb_none.setChecked(true);
String[] currency_symbols_options_array = getResources().getStringArray(R.array.currency_symbols);
for ( int i=0; i < currency_symbols_options_array.length; i++ ) {
RadioButton rb = new RadioButton(this);
rb.setText(currency_symbols_options_array[i]);
currencySettingRadioGroup.addView(rb,i+1);
if (v_currency_symbol.equals(currency_symbols_options_array[i].substring(0,1))) rb.setChecked(true);
}
来源:https://stackoverflow.com/questions/47122143/strange-behaviour-of-programatically-created-radiogroup