2017-11-05 3 views
0

Ich bin programmatisch hinzufügen RadioButtons zu einem bereits bestehenden aber leer RadioGroup mit dem folgenden Code.Seltsames Verhalten von programmgesteuert erstellt RadioGroup

 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); 
     } 

Das Layout XML ist wie folgt:

<?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> 

Die RadioGroup wird richtig gebaut und die RadioButton mit dem Text, den meine v_currency_symbol erste Zeichen der Variablen übereinstimmt, wird wie erwartet geprüft.

Correct RadioButton selected when dialog opens

Allerdings ist keines der anderen RadioButton s klicken nicht dazu führen, die geprüfte Option zu deaktivieren - ich mit zwei Optionen geprüft enden.

Clicking another option does not uncheck first

Ein Klick und jede der anderen Optionen Überprüfung bewirkt, dass die zweite aufgegebene Position zu deaktivieren, aber die ersten RadioButton kontrolliert bleibt.

Other radio buttons behave like a separate radio group

Es ist fast, als ob die RadioButton, die programmatisch zu einem separaten Radiogroup, gehört überprüft wird.

Entfernen der zwei Zeilen, die eine der RadioButton s bei der Erstellung überprüfen, ermöglicht die RadioGroup ordnungsgemäß funktioniert, aber Sie können natürlich nicht sehen, die vorherige Auswahl.

+0

Sie Ihren Code debuggen müssen wissen, wo das Problem kommen aus ?, BTW die 'None' Radioknopf eine der radiogroup sein sollte, warum Sie es getrennt **' Sie zwei radio button an die selbe radioGroup hinzugefügt, was bedeutet, dass du zwei checked buttons haben wirst. ** – Ibrahim

+0

Alles scheint korrekt zu funktionieren, außer dem steckengebliebenen Knopf. 'onClick'-Ereignisse auf den' RadioButtons' werden korrekt ausgelöst usw., um den 'v_currency_symbol'-Wert korrekt zu setzen, und wenn der Dialog geschlossen und wieder geöffnet wird, wird der korrekte me-Wert als markiert angezeigt, aber dann bleibt dieser fest. Und die 'None' Option ist innerhalb der' RadioGroup' und wird nicht von dem Array erzeugt, das von der for-Schleife gelesen wird. –

Antwort

0

Ich fand das Problem ... Überprüfung der RadioButtonvor Hinzufügen der RadioGroup verursacht das Problem.

Durch den Austausch der beiden relevanten Zeilen wird das Problem behoben. Der Arbeitscode ist wie folgt:?

// 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); 
    }