161 votes

Ajout de boutons radio personnalisés dans Android

J'essaie d'obtenir l'effet radiobouton pour les boutons ordinaires dans Android.

J'ai un simple bouton radio Android ci-dessous

enter image description here

Le code pour cela est : :

activité_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="RadioButton1" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton2" />

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton3" />
    </RadioGroup>

</RelativeLayout>

Comment le personnaliser comme suit: :

enter image description here

Gracias ¡!

[EDIT] en utilisant le code d'une des réponses

enter image description here

Mais le nom du bouton est éclipsé par l'option de sélection : comment le supprimer ?


{EDIT} plus de changements

Les changements finaux devraient au moins me permettre de savoir quel bouton j'ai sélectionné parmi les trois boutons radio .... est-il possible d'obtenir ce qui suit ?

enter image description here

5 votes

4 ans plus tard LOL - ceci pourrait vous être utile crosp.net/blog/Android/

1 votes

@SomeoneSomewhere ..... Hahaha ... Merci... C'est utile :) :)

0 votes

La façon la plus simple de le faire a décrit aquí ..

275voto

Evan B Points 1427

Ajoutez une image d'arrière-plan qui fait référence à une image ou à un sélecteur (comme ci-dessous), et rendez le bouton transparent :

<RadioButton
    android:id="@+id/radio0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@null"
    android:button="@drawable/yourbuttonbackground"
    android:checked="true"
    android:text="RadioButton1" />

Si vous souhaitez que vos boutons radio aient une ressource différente lorsqu'ils sont cochés, créez un drawable d'arrière-plan de sélecteur :

res/drawable/yourbuttonbackground.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/b"
        android:state_checked="true"
        android:state_pressed="true" />
    <item
        android:drawable="@drawable/a"
        android:state_pressed="true" />
    <item
        android:drawable="@drawable/a"
        android:state_checked="true" />
    <item
        android:drawable="@drawable/b" />
</selector>

Dans le sélecteur ci-dessus, nous faisons référence à deux éléments graphiques, a y b voici comment nous les créons :

res/drawable/a.xml - État sélectionné

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:radius="5dp" />
    <solid
        android:color="#fff" />
    <stroke
        android:width="2dp"
        android:color="#53aade" />
</shape>

res/drawable/b.xml - État normal

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:radius="5dp" />
    <solid
        android:color="#fff" />
    <stroke
        android:width="2dp"
        android:color="#555555" />
</shape>

Plus d'informations sur les tiroirs ici : http://developer.Android.com/guide/topics/resources/drawable-resource.html

1 votes

Hé, merci, j'ai réussi à créer la fonctionnalité... Mais le nom du bouton est écrasé par l'option de sélection ..... comment supprimer cela ... en gardant la fonctionnalité intacte .... Tout ce que j'essaie de faire, comme je l'ai montré dans ma question ... N'hésitez pas à me donner des indications supplémentaires ! [Note: : veuillez consulter la question mise à jour].

2 votes

@Unicorn Add android:button="@android:color/transparent" pour l'enlever.

0 votes

@ Evan B ...... cela fonctionne mais ... j'ai besoin de savoir quel bouton est sélectionné et aussi le texte ne doit pas être recouvert par quoi que ce soit.... j'ai modifié la question ... s'il vous plaît jetez un coup d'oeil à la question mise à jour ... c'est le dernier élément d'information ... que je cherche :)

105voto

Pratik Butani Points 4290

J'ai mis à jour la réponse acceptée et supprimé les choses inutiles.

J'ai créé un XML pour l'image suivante.

enter image description here

Votre XML code pour RadioButton le sera :

<RadioGroup
        android:id="@+id/daily_weekly_button_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="@dimen/_80sdp"
            android:gravity="center"
            android:layout_height="wrap_content"
            android:background="@drawable/radio_flat_selector"
            android:button="@android:color/transparent"
            android:checked="true"
            android:paddingLeft="@dimen/_16sdp"
            android:paddingTop="@dimen/_3sdp"
            android:paddingRight="@dimen/_16sdp"
            android:paddingBottom="@dimen/_3sdp"
            android:text="Daily"
            android:textColor="@color/radio_flat_text_selector" />

        <RadioButton
            android:id="@+id/radio1"
            android:gravity="center"
            android:layout_width="@dimen/_80sdp"
            android:layout_height="wrap_content"
            android:background="@drawable/radio_flat_selector"
            android:button="@android:color/transparent"
            android:paddingLeft="@dimen/_16sdp"
            android:paddingTop="@dimen/_3sdp"
            android:paddingRight="@dimen/_16sdp"
            android:paddingBottom="@dimen/_3sdp"
            android:text="Weekly"
            android:textColor="@color/radio_flat_text_selector" />

</RadioGroup>

radio_flat_selector.xml pour le sélecteur de fond :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/radio_flat_selected" android:state_checked="true" />
    <item android:drawable="@drawable/radio_flat_regular" />
</selector>

radio_flat_selected.xml pour le bouton sélectionné :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:radius="1dp"
        />
    <solid android:color="@color/colorAccent" />
    <stroke
        android:width="1dp"
        android:color="@color/colorAccent" />
</shape>

radio_flat_regular.xml pour le sélecteur régulier :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="1dp" />
    <solid android:color="#fff" />
    <stroke
        android:width="1dp"
        android:color="@color/colorAccent" />
</shape>

Tous les codes des 3 fichiers ci-dessus seront dans drawable/ dossier.

Maintenant, nous avons également besoin Text Sélecteur de couleur pour modifier la couleur du texte en conséquence.

radio_flat_text_selector.xml pour le sélecteur de couleur de texte

(Utiliser color/ pour ce fichier).

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_checked="false" />
    <item android:color="@color/colorWhite" android:state_checked="true" />
</selector>

Note : J'ai référencé de nombreuses réponses pour ce type de solution mais je n'ai pas trouvé de bonne solution donc je la fais.

J'espère que cela vous sera utile.

Merci.

0 votes

J'arrive à me rapprocher de ce que je veux avec ça, mais je vois aussi le rayon des coins entre les éléments. Lorsque j'ai trois boutons, j'obtiens ceci. Existe-t-il un moyen de faire en sorte que le rayon ne s'applique qu'au groupe lui-même ? imgur.com/mP8dtKR

2 votes

@AdamMc331, vous devrez créer 3 sélecteurs, un pour le bouton au début de la rangée, un pour ceux du milieu et un autre pour le dernier, où vous pourrez ensuite ajuster et avoir un coin arrondi pour l'un des bords, et aussi cacher l'un d'entre eux avec un marquage négatif si vous enveloppez le <shape> à l'intérieur d'un <item> qui est à l'intérieur d'un <layer-list>.

2 votes

Comment créer une couleur/un dossier ? Pouvez-vous m'aider ?

46voto

Seslyn Points 88

Utilisez le même format de fichier XML que dans la réponse d'Evan, mais un seul fichier dessinable est suffisant pour le formatage.

<RadioButton
    android:id="@+id/radio0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_button_background"
    android:button="@android:color/transparent"
    android:checked="true"
    android:text="RadioButton1" />

Et votre fichier dessinable séparé :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_pressed="true" >
         <shape android:shape="rectangle" >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#333333" />
             <solid android:color="#cccccc" />            
         </shape>
    </item>

    <item android:state_checked="true">
         <shape android:shape="rectangle" >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#333333" />
             <solid android:color="#cccccc" /> 
         </shape>
    </item>  

    <item>
         <shape android:shape="rectangle"  >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#cccccc" />
             <solid android:color="#ffffff" />            
         </shape>
    </item>
</selector>

1 votes

Merci pour cette initiative... elle semble utile. Je suis encore en train de l'essayer. Le nom du drawable, customButtonBackground, n'est pas autorisé à contenir des majuscules - c'est du moins ce que me dit Android Studio.

14voto

Annu Points 94

Réglage de android:background y android:button du RadioButton comme la réponse acceptée n'a pas fonctionné pour moi. L'image dessinable était affichée en tant qu'arrière-plan (bien que android:button était défini comme transparent) au texte du bouton radio en tant que enter image description here

android:background="@drawable/radiobuttonstyle"
    android:button="@android:color/transparent"

Ainsi, le radiobouton est devenu le dessinable personnalisé radiobuttonstyle.xml.

<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Maintenance"
    android:id="@+id/radioButton1"
    android:button="@drawable/radiobuttonstyle"
      />

et radiobuttonstyle.xml est comme suit

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

et après cela, le radiobouton avec le style de bouton personnalisé a fonctionné.

enter image description here

8voto

flchaux Points 24

Vous devez remplir l'attribut "Button" de la classe "CompoundButton" avec un chemin traçable XML ( ma_boîte à cocher ). Dans le dessinateur XML, vous devez avoir :

<?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/checkbox_not_checked" />
     <item android:state_checked="true" android:drawable="@drawable/checkbox_checked" />
     <item android:drawable="@drawable/checkbox_not_checked" /> <!-- default -->
</selector>

N'oubliez pas de remplacer ma_boîte à cocher par votre nom de fichier de la case à cocher à dessiner , checkbox_not_checked par votre drawable PNG qui est votre case à cocher lorsqu'elle n'est pas cochée et checkbox_checked avec votre image lorsqu'elle est cochée.

Pour la taille, mettez directement à jour les paramètres de mise en page.

1 votes

Je pense que le PO souhaite que le texte soit intégré au bouton. Je pense que la seule façon de le faire est d'appliquer le drawable à l'élément android:background contre le android:button ; puis en déclarant le android:button comme transparent. De cette façon, le texte peut être placé à l'intérieur du bouton.

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