Ustaw wybrany indeks grupy radiowej Android

96

Czy istnieje sposób na ustawienie wybranego indeksu RadioGroup w systemie Android, inny niż przechodzenie przez podrzędne radiobuttons i zaznaczanie opcji zaznaczania przycisku radiowego przy wybranym indeksie?

Uwaga: zapełniam grupę przycisków opcji w czasie wykonywania.

Hassan Mokdad
źródło

Odpowiedzi:

203

Jeśli grupa radiowa jest zdefiniowana w pliku xml układu, do każdego przycisku można przypisać identyfikator. Następnie po prostu zaznacz taki przycisk

radioGroup.check(R.id.myButtonId);

Jeśli utworzyłeś swoją grupę radiową programowo (nie jestem nawet pewien, jak to zrobisz ...), możesz rozważyć utworzenie specjalnego pliku xml układu tylko dla grupy radiowej, aby można było przypisać R.id. * ids do przycisków.

Zobacz odpowiedź poniżej, jeśli faktycznie chcesz ustawić grupę przycisków opcji według indeksu, zobacz odpowiedź poniżej.

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);
jjm
źródło
2
Cześć, stworzyłem je programowo przy użyciu tego kodu: for (int i = 0; i <lookupTypes.size (); i ++) {// RadioButton rbt = new RadioButton (this); //, null, // R.style. RadioGroupItem); RadioButton rbt = (RadioButton) getLayoutInflater (). Inflate (R.layout.tmpltradiobutton, null); rbt.setId (i); rbt.setText (lookupTypes.get (i) .getValue ()); rbt.setTag (lookupTypes.get (i)); rbtnGroup.addView (rbt); }
Hassan Mokdad
Ponieważ ustawiasz ich identyfikatory na indeks w lookupTypes, możesz po prostu użyć tego indeksu jako argumentu checkmetody.
jjm
ta odpowiedź dosłownie wyjaśnia ponownie to, co zadający pytanie już podał - drugą odpowiedzią powinna być odpowiedź zaakceptowana, ponieważ poprawnie mówi, jak wybrać według indeksu.
Lassi Kinnunen
@LassiKinnunen Wydaje mi się, że liczba głosów za tą odpowiedzią sugeruje, że ludzie otrzymują od niej to, czego potrzebują ... to powiedziawszy, masz rację, że druga odpowiedź jest bardziej poprawna w przypadku
zadanego
2
Szczerze mówiąc, czuję się trochę zażenowany, że to moja najwyższa głosowana odpowiedź.
jjm
87

Pytanie brzmiało „ustaw wybrany INDEKS”, oto jak ustawić go według indeksu:

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);

........

Dodatkowe informacje: Wygląda na to, że Google chce, abyś używał identyfikatora zamiast indeksu, ponieważ użycie identyfikatora jest bardziej odporne na błędy. Na przykład, jeśli masz inny element interfejsu użytkownika w swojej RadioGroup lub jeśli inny programista ponownie zamawia RadioButtons, indeksy mogą się zmienić i nie być zgodne z oczekiwaniami. Ale jeśli jesteś jedynym programistą, to jest w porządku.

Siavash
źródło
Czy możesz wyjaśnić ten kod, jak to jest właściwa odpowiedź?
rfornal
1
@rfornal ten kod umożliwia przechwycenie przycisku radiowego przez INDEX, w przeciwieństwie do View id (takiego jak R.id.radioButton1) i zmniejsza potrzebę implementacji tabeli odnośników w celu konwersji indeksu na identyfikator widoku.
Siavash
5

Odpowiedź Siavasha jest prawidłowa:

((RadioButton)radioGroup.getChildAt(index)).setChecked(true);

Należy jednak pamiętać, że grupa radioGroup może zawierać widoki inne niż radioButtons - tak jak w tym przykładzie, który zawiera słabą linię pod każdym wyborem.

<RadioGroup
    android:id="@+id/radioKb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RadioButton
        android:id="@+id/kb1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Onscreen - ABC" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Onscreen - Qwerty" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Standard softkey" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

    <RadioButton
        android:id="@+id/kb4"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:text="Physical keyboard" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#33000000" />

</RadioGroup>

W takim przypadku użycie indeksu na przykład 1 spowodowałoby błąd. Element pod indeksem 1 to pierwsza linia separatora - nie jest to radioButton. RadioButtons w tym przykładzie mają indeksy 0, 2, 4, 6.

Alan
źródło
3

możesz znaleźćViewById z grupy radiowej.

((RadioButton)my_radio_group.findViewById(R.id.radiobtn_veg)).setChecked(true);`
Faheem
źródło
2

To zadziałało dla mnie, utworzyłem przycisk opcji dynamicznie przez

  private void createRadioButton() {

    RadioButton[] rb = new RadioButton[5];

    RadioGroup.LayoutParams layoutParams = new RadioGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            1.0f);

    radioGroup.setOrientation(RadioGroup.HORIZONTAL);

    for (int ID = 0; ID < 5; ID++) {
        rb[ID] = new RadioButton(this);
        rb[ID].setLayoutParams(layoutParams);
        rb[ID].setText("Button_Text");
        radioGroup.addView(rb[ID]); //the RadioButtons are added to the radioGroup instead of the layout
    }
}

Teraz sprawdź przycisk za pomocą,

int radio_button_Id = radioGroup.getChildAt(index).getId();

radioGroup.check( radio_button_Id );
Mukeshkumar S
źródło
0

Wewnątrz onBindViewHolder ustaw tag na Button Group

@Override
public void onBindViewHolder(final CustomViewHolder holder, final int position) {
   ...
   holder.ButtonGroup.setTag(position);
}

i w ViewHolder

ButtonGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        ...
        int id = radioGroup.getCheckedRadioButtonId();

        RadioButton radioButton = (RadioButton) radioGroup.findViewById(id);

        int clickedPos = (Integer) radioGroup.getTag();

        packageModelList.get(clickedPos).getPoll_quest()
    }
Jiten Basnet
źródło
0

Używając Kotlina możesz to zrobić

  (radio_group_id.getChildAt(index) as RadioButton).isChecked = true

lub

radio_group_id.check(R.id.radio_button_id)

AbdelraZek
źródło