47 votes

Android : Comment obtenir un radiogroupe avec des togglebuttons ?

Je veux un groupe de boutons où l'utilisateur peut choisir l'un d'entre eux comme option. Le comportement doit être similaire à celui d'un groupe de boutons radio, mais je ne veux pas que le cercle radio soit présent. Je veux simplement que l'utilisateur puisse faire basculer un seul des boutons.

Je pense que j'aurais besoin de quelque chose comme un groupe à bascule.

Est-ce que quelque chose comme ça existe dans Android ?

0 votes

Toujours ouvert, mais j'ai utilisé une autre approche sans avoir besoin d'un radiogroupe.

6 votes

Quelle approche avez-vous utilisée ?

90voto

Wolf Paulus Points 496

J'ai juste réutilisation le site RadioGroup comme ça : (veuillez noter le onClick c'est-à-dire qu'un clic sur un bouton déclenchera l'attribut de l'Activité onToggle(View) méthode.

<RadioGroup android:id="@+id/toggleGroup"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:orientation="horizontal"
        >

    <ToggleButton android:id="@+id/btn_Letter"
                  android:layout_height="wrap_content"
                  android:layout_width="fill_parent"
                  android:layout_weight="1"
                  android:textSize="14sp"
                  android:textOn="Letter"
                  android:textOff="Letter"
                  android:onClick="onToggle"
                  android:checked="true"
            />
    <ToggleButton android:id="@+id/btn_A4"
                  android:layout_height="wrap_content"
                  android:layout_width="fill_parent"
                  android:layout_weight="1"
                  android:textSize="14sp"
                  android:textOn="A4"
                  android:textOff="A4"
                  android:onClick="onToggle"
            />
</RadioGroup>

Dans votre activité, ou à un autre endroit, vous pouvez définir un écouteur, par ex.

static final RadioGroup.OnCheckedChangeListener ToggleListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(final RadioGroup radioGroup, final int i) {
            for (int j = 0; j < radioGroup.getChildCount(); j++) {
                final ToggleButton view = (ToggleButton) radioGroup.getChildAt(j);
                view.setChecked(view.getId() == i);
            }
        }
    };

et l'enregistrer, par exemple dans onCreate() :

@Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     this.setContentView(R.layout.scan_settings);

     ((RadioGroup) findViewById(R.id.toggleGroup)).setOnCheckedChangeListener(ToggleListener);    
 }

enfin dans onToggle(View) vous feriez tout ce qui doit être fait, en fonction de votre application, et vous appelleriez également la méthode d'évaluation de RadioGroup vérifier avec l'identifiant de la vue basculée. Ainsi :

public void onToggle(View view) {
    ((RadioGroup)view.getParent()).check(view.getId());
    // app specific stuff ..
}

8 votes

Je suggère d'ajouter ((RadioGroup)view.getParent()).check(0); avant de définir la nouvelle valeur réelle dans onToggle . Cela empêchera les fonctionnalités de basculement du ToggleButton et le forcera à se comporter comme un RadioButton à l'aide de la fonction ToggleListener .

0 votes

Merci... c'est exactement ce que je cherchais puisque j'ai pu me débarrasser du stupide cercle rond du bouton radio en essayant de le styliser. Il est important de noter que si vous stylez les boutons, n'oubliez pas d'en avoir un avec Android:state_checked="true" ou vous aurez l'impression que les boutons ne font rien :-P

0 votes

À l'intérieur de l'écouteur de contrôle de la radio, vous devez faire ce qui suit : if(view.getId == i) { view.setChecked(true) } else { view.setChecked(false) ; } De cette façon, il imite un vrai groupe radio.

13voto

dhaag23 Points 3709

Vous pouvez utiliser des boutons radio ordinaires et utiliser une image pour l'arrière-plan du RadioButton et ne pas spécifier de chaîne de texte :

<RadioButton 
android:id="@+id/custom_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
    android:button="@null"
    android:background="@drawable/button_custom"
    />

Pour l'arrière-plan, utilisez n'importe quelle drawable, mais vous voudrez probablement utiliser un sélecteur pour pouvoir fournir des images différentes pour les différents états. La version la plus simple utilise seulement deux images :

<item android:state_checked="true" android:state_pressed="true"
      android:drawable="@drawable/custom_selected" />
<item android:state_checked="false" android:state_pressed="true"
      android:drawable="@drawable/custom_normal" />

<item android:state_checked="true" android:state_focused="true"
      android:drawable="@drawable/custom_selected" />
<item android:state_checked="false" android:state_focused="true"
      android:drawable="@drawable/custom_normal" />

<item android:state_checked="false" android:drawable="@drawable/custom_normal" />
<item android:state_checked="true" android:drawable="@drawable/custom_selected" />

Ainsi, la case d'option ressemble à un bouton ordinaire (ou plutôt, ressemble à n'importe quel dessinable que vous avez fourni) et se comporte comme une case d'option dans un groupe d'options.

0 votes

Mais que faire si je veux que ces boutons s'adaptent à la largeur du parent alors que l'arrière-plan est étiré uniformément et centré (comme scaleType="centerInside" de ImageView) ?

2 votes

Cette solution est la plus propre. Elle maintient le RadioButton fonctionnalité tout en obtenant l'effet visible de ToggleButton . La solution de @Wolf Paulus fonctionne, mais elle permet au groupe d'être dans un état où tous les boutons sont désactivés.

3voto

CaspNZ Points 4357

J'ai essayé toutes les méthodes décrites ci-dessus et aucune n'a vraiment fonctionné.

Essayer de modifier un bouton radio pour qu'il ressemble à un vrai bouton n'a pas l'air bien.

Finalement, j'ai simplement pris le code source du RadioGroup et je l'ai modifié pour accepter un ToggleButton plutôt qu'un RadioButton. Cela fonctionne très bien !

Voici la source sur Github : ToggleGroup

Utilisation :

    <com.rapsacnz.ToggleGroup
    android:id="@+id/deal_detail_toolbar"
    android:layout_width="fill_parent"
    android:layout_height="60dip"
    android:layout_alignParentBottom="true"
    android:background="@drawable/bgnd_toggle_button">
    <ToggleButton
        android:id="@+id/b1"
        android:textOn="@string/tab_1_label"
        android:textOff="@string/tab_1_label"
        android:textSize="10sp"
        android:textColor="@color/tab_button_color"
        android:checked="true"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:layout_weight="1"
        android:drawableTop="@drawable/toggle_spotlight"
        android:drawablePadding="-5dp "
        android:gravity="bottom|center"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        android:background="@drawable/bgnd_transparent" />
    <ToggleButton
        android:id="@+id/b2"
        android:textOn="@string/tab_2_label"
        android:textOff="@string/tab_2_label"
        android:textSize="10sp"
        android:textColor="@color/tab_button_color"
        android:checked="false"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:layout_weight="1"
        android:drawableTop="@drawable/toggle_browse"
        android:gravity="bottom|center"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        android:background="@drawable/bgnd_transparent" />

    <ToggleButton
        android:id="@+id/b3"
        android:textOn="@string/tab_3_label"
        android:textOff="@string/tab_3_label"
        android:textSize="10sp"
        android:textColor="@color/tab_button_color"
        android:checked="false"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:layout_weight="1"
        android:drawableTop="@drawable/toggle_purchased"
        android:gravity="bottom|center"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        android:background="@drawable/bgnd_transparent" />
</com.rapsacnz.ToggleGroup>

J'espère que cela vous aidera

2 votes

Le code que vous avez publié ici a un petit problème, si le bouton de basculement @+id/b1 (ou tout autre bouton de basculement) est activé (coché) et que vous appuyez à nouveau sur le bouton, celui-ci sera désactivé (non coché). Ce comportement n'existe pas pour les boutons radio dans les groupes radio. Pour résoudre ce problème, j'ai changé la méthode de classe onCheckedChanged en :

2 votes

// empêche la récursion infinie if (mProtectFromCheckedChange) { return ; } int id = buttonView.getId() ; mProtectFromCheckedChange = true ; if(mCheckedId == id){ //si la même chose est vérifiée, setCheckedStateForView(mCheckedId, true) ; } else if (mCheckedId ! = -1) { setCheckedStateForView(mCheckedId, false) ; } mProtectFromCheckedChange = false ; setCheckedId(id) ;

0 votes

Merci ! J'ai peut-être fait cela moi-même dans mon code de production - j'ai oublié de le modifier ici.

1voto

user2287189 Points 1

Ma solution permet d'obtenir le même effet, mais sans utiliser les boutons radio.

Pour le xml, d'abord un "selector" dans "@drawable/myselectorfile" :

   <?xml version="1.0" encoding="UTF-8"?>
      <selector
           xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_checked="false"
        android:drawable="@drawable/icon_off" />
       <item android:state_checked="true"
        android:drawable="@drawable/icon_on" />
   </selector>

un fichier pour les éléments de ma liste :

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal" >

    <TextView
        android:id="@+id/txtInfo"
        android:layout_width="140dp"
        android:layout_height="wrap_content"
        android:paddingTop="15dip" />

   <ToggleButton
       android:id="@+id/BtnToggle"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_alignParentTop="true"
       android:layout_marginRight="14dp"
       android:background="@drawable/toggle_style"
       android:padding="10dip"
       android:textOff=""
       android:textOn="" 
       android:focusable="false"/>  

   </LinearLayout>

et mon listview :

   <?xml version="1.0" encoding="utf-8"?>
      <ListView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/lv_lista"
       android:layout_width="match_parent"
       android:layout_height="match_parent" >
    </ListView> 

dans la méthode oncreate :

     lista.setOnItemClickListener(new OnItemClickListener() { 
        @SuppressWarnings("deprecation")
        @Override
        public void onItemClick(AdapterView<?> pariente, View view, int    posicion, long id) {
        @SuppressWarnings("unused")
        ListEntity elegido = (ListEntity) pariente.getItemAtPosition(posicion); 

        varToggle = (ToggleButton) view.findViewById(R.id.BtnToggle);
        varToggle.setChecked(true);

                    // showDialog(0); // dialog optional

                   //restart btn's
                  reStart(posicion);
        }
        });

dans la classe Activity :

         @Override
         protected Dialog onCreateDialog(int id){
            Dialog dialogo = crearDialogoConfirmacion(); 
            return dialogo; 
         }

         public void reStart(int posicion){ 

         for(int j=0;j<lista.getCount();j++)
             {
               View vista = lista.getChildAt(j);
               ToggleButton varToggle2 = (ToggleButton) vista.findViewById(R.id.BtnToggle);
               if(j != posicion){ varToggle2.setChecked(false); }              
              } 
          }

0voto

Janusz Points 52607

Vous voulez donc des boutons dont un seul peut être sélectionné à la fois ? Si vous ne montrez pas le bouton radio, comment l'utilisateur peut-il savoir ce qu'il a sélectionné ?

Vous pouvez travailler avec RadioButton et RadioGroup mais je ne sais pas si vous pouvez facilement générer un bouton radio personnalisé avec un look plus adapté à votre application. Mais cela devrait être possible d'une manière ou d'une autre si vous pouvez étendre le radiobouton lui-même et surcharger la méthode draw, ou regarder quels types de boutons peuvent être intégrés dans une application de type radiogroupe . Vous pouvez peut-être implémenter une interface spéciale pour votre vue, puis regrouper certains de vos boutons personnalisés dans un radiogroupe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X