web-dev-qa-db-fra.com

Comment personnaliser le bouton?

Je cherche à personnaliser le bouton Switch pour devenir comme suit: 

enter image description here

Comment y parvenir?

33
Chulo

vous pouvez utiliser le code suivant pour changer color et text :

<org.jraf.Android.backport.switchwidget.Switch
                        Android:id="@+id/th"
                        Android:layout_width="match_parent"
                        Android:layout_height="wrap_content"
                        app:thumb="@drawable/apptheme_switch_inner_holo_light"
                        app:track="@drawable/apptheme_switch_track_holo_light"
                        app:textOn="@string/switch_yes"
                        app:textOff="@string/switch_no"
                        Android:textColor="#000000"
                        />

Créez un fichier XML nommé colors.xml dans le dossier res/values:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#ff0000</color>
    <color name="green">#00ff00</color>
</resources>

Dans le dossier drawable, créez un fichier XML my_btn_toggle.xml:

  <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <item Android:state_checked="false" Android:drawable="@color/red"  />
        <item Android:state_checked="true" Android:drawable="@color/green"  />
    </selector>

et dans la section xml définissant votre bouton bascule ajouter:

Android:background="@drawable/my_btn_toggle

pour changer la couleur de textOn et textOffuse 

Android:switchTextAppearance="@style/Switch"
22
said

Cependant, ce n’est peut-être pas la meilleure solution, mais j’ai choisi une méthode différente pour résoudre tous les problèmes liés à Switch ...

<RadioGroup
        Android:checkedButton="@+id/offer"
        Android:id="@+id/toggle"
        Android:layout_width="match_parent"
        Android:layout_height="30dp"
        Android:layout_marginBottom="@dimen/margin_medium"
        Android:layout_marginLeft="50dp"
        Android:layout_marginRight="50dp"
        Android:layout_marginTop="@dimen/margin_medium"
        Android:background="@drawable/pink_out_line"
        Android:orientation="horizontal">

        <RadioButton
            Android:layout_marginTop="1dp"
            Android:layout_marginBottom="1dp"
            Android:layout_marginLeft="1dp"
            Android:id="@+id/search"
            Android:background="@drawable/toggle_widget_background"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:button="@null"
            Android:gravity="center"
            Android:text="Search"
            Android:textColor="@color/white" />

        <RadioButton
            Android:layout_marginRight="1dp"
            Android:layout_marginTop="1dp"
            Android:layout_marginBottom="1dp"
            Android:id="@+id/offer"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:background="@drawable/toggle_widget_background"
            Android:button="@null"
            Android:gravity="center"
            Android:text="Offers"
            Android:textColor="@color/white" />
    </RadioGroup>

pink_out_line.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">
    <corners Android:radius="2dp" />
    <solid Android:color="#80000000" />
    <stroke
        Android:width="1dp"
        Android:color="@color/pink" />
</shape>

toggle_widget_background.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/pink" Android:state_checked="true" />
    <item Android:drawable="@color/dark_pink" Android:state_pressed="true" />
    <item Android:drawable="@color/transparent" />
</selector>

Et voici la sortie -  enter image description here

111
Sanjeet A
<Switch Android:layout_width="wrap_content" 
                    Android:layout_height="wrap_content"
                    Android:thumb="@drawable/custom_switch_inner_holo_light"
                    Android:track="@drawable/custom_switch_track_holo_light"
                    Android:textOn="@string/yes"
                    Android:textOff="@string/no"/>

drawable/custom_switch_inner_holo_light.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_enabled="false" Android:drawable="@drawable/custom_switch_thumb_disabled_holo_light" />
    <item Android:state_pressed="true"  Android:drawable="@drawable/custom_switch_thumb_pressed_holo_light" />
    <item Android:state_checked="true"  Android:drawable="@drawable/custom_switch_thumb_activated_holo_light" />
    <item                               Android:drawable="@drawable/custom_switch_thumb_holo_light" />
</selector>

drawable/custom_switch_track_holo_light.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true"  Android:drawable="@drawable/custom_switch_bg_focused_holo_light" />
    <item                               Android:drawable="@drawable/custom_switch_bg_holo_light" />
</selector>

Les images suivantes sont 9.paths drawables et ils doivent être de densité différente (mdpi, hdpi, xhdpi, xxhdpi). Comme exemple, je donne xxhdpi (vous pouvez les redimensionner si nécessaire):

drawable/custom_switch_thumb_disabled_holo_light

custom_switch_thumb_disabled_holo_light

drawable/custom_switch_thumb_pressed_holo_light

custom_switch_thumb_pressed_holo_light

drawable/custom_switch_thumb_activated_holo_light

custom_switch_thumb_activated_holo_light

drawable/custom_switch_thumb_holo_light

custom_switch_thumb_holo_light

drawable/custom_switch_bg_focused_holo_light

custom_switch_bg_focused_holo_light

drawable/custom_switch_bg_holo_light

enter image description here

19
SiavA

J'ai réalisé ceci 

 enter image description here

en faisant:

1) sélecteur personnalisé:

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

2) en utilisant v7 SwitchCompat

<Android.support.v7.widget.SwitchCompat
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@null"
    Android:button="@drawable/checkbox_yura"
    Android:thumb="@null"
    app:track="@null"/>
6
YTerle

J'utilise cette approche pour créer un commutateur personnalisé à l'aide de RadioGroup et RadioButton;

Aperçu

 enter image description here

Ressource de couleur

<color name="blue">#FF005a9c</color>
<color name="lightBlue">#ff6691c4</color>
<color name="lighterBlue">#ffcdd8ec</color>

Drawables

control_switch_background_border.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">
    <corners Android:radius="5dp" />
    <solid Android:color="@Android:color/transparent" />
    <stroke
        Android:width="3dp"
        Android:color="@color/blue" />
</shape>

control_switch_background_selector.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true">
        <shape>
            <solid Android:color="@color/blue"></solid>
        </shape>
    </item>
    <item Android:state_pressed="true">
        <shape>
            <solid Android:color="@color/lighterBlue"></solid>
        </shape>
    </item>
    <item>
        <shape>
            <solid Android:color="@Android:color/transparent"></solid>
        </shape>
    </item>
</selector>

control_switch_background_selector_middle.xml

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true">
        <shape>
            <solid Android:color="@color/blue"></solid>
        </shape>
    </item>
    <item Android:state_pressed="true">
        <shape>
            <solid Android:color="@color/lighterBlue"></solid>
        </shape>
    </item>
    <item>
        <layer-list>
            <item Android:top="-1dp" Android:bottom="-1dp" Android:left="-1dp">
                <shape>
                    <solid Android:color="@Android:color/transparent"></solid>
                    <stroke Android:width="1dp" Android:color="@color/blue"></stroke>
                </shape>
            </item>
        </layer-list>
    </item>
</selector>

Disposition

<RadioGroup
        Android:checkedButton="@+id/calm"
        Android:id="@+id/toggle"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="24dp"
        Android:layout_marginRight="24dp"
        Android:layout_marginBottom="24dp"
        Android:layout_marginTop="24dp"
        Android:background="@drawable/control_switch_background_border"
        Android:orientation="horizontal">
        <RadioButton
            Android:layout_marginTop="3dp"
            Android:layout_marginBottom="3dp"
            Android:layout_marginLeft="3dp"
            Android:paddingTop="16dp"
            Android:paddingBottom="16dp"
            Android:id="@+id/calm"
            Android:background="@drawable/control_switch_background_selector_middle"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:button="@null"
            Android:gravity="center"
            Android:text="Calm"
            Android:fontFamily="sans-serif-medium"
            Android:textColor="@color/control_switch_color_selector"/>
        <RadioButton
            Android:layout_marginTop="3dp"
            Android:layout_marginBottom="3dp"
            Android:paddingTop="16dp"
            Android:paddingBottom="16dp"
            Android:id="@+id/rumor"
            Android:background="@drawable/control_switch_background_selector_middle"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:button="@null"
            Android:gravity="center"
            Android:text="Rumor"
            Android:fontFamily="sans-serif-medium"
            Android:textColor="@color/control_switch_color_selector"/>
        <RadioButton
            Android:layout_marginTop="3dp"
            Android:layout_marginBottom="3dp"
            Android:layout_marginRight="3dp"
            Android:paddingTop="16dp"
            Android:paddingBottom="16dp"
            Android:id="@+id/outbreak"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            Android:background="@drawable/control_switch_background_selector"
            Android:button="@null"
            Android:gravity="center"
            Android:text="Outbreak"
            Android:fontFamily="sans-serif-medium"
            Android:textColor="@color/control_switch_color_selector" />
</RadioGroup>
6
Tebo

Vous pouvez utiliser le widget de commutation standard et appeler simplement les fonctions setTextOn() et setTextOff() ou utiliser les attributs Android:textOn et Android:textOff.

5
Karakuri

Il y a deux façons de créer un ToggleButton personnalisé.

1) En définissant un arrière-plan personnalisé 2) En créant un bouton personnalisé

Vérifiez http://www.zoftino.com/Android-toggle-button pour les styles personnalisés

Bouton basique avec fond personnalisé

Définissez drawable comme ressource XML comme ci-dessous et définissez-le comme arrière-plan du bouton bascule. Dans l'exemple ci-dessous, toggle_color drawable est un sélecteur de couleur, vous devez également le définir.

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:insetLeft="4dp"
    Android:insetTop="4dp"
    Android:insetRight="4dp"
    Android:insetBottom="4dp">
    <layer-list Android:paddingMode="stack">
        <item>
            <ripple Android:color="?attr/Android:colorControlHighlight">
                <item>
                    <shape Android:shape="rectangle"
                        Android:tint="?attr/Android:colorButtonNormal">
                        <corners Android:radius="8dp"/>
                        <solid Android:color="@Android:color/white" />
                        <padding Android:left="8dp"
                            Android:top="6dp"
                            Android:right="8dp"
                            Android:bottom="6dp" />
                    </shape>
                </item>
            </ripple>
        </item>
        <item Android:gravity="left|fill_vertical">
            <shape Android:shape="rectangle">
                <corners Android:radius="4dp"/>
                <size Android:width="8dp" />
                <solid Android:color="@color/toggle_color" />
            </shape>
        </item>
        <item Android:gravity="right|fill_vertical">
            <shape Android:shape="rectangle">
                <corners Android:radius="4dp"/>
                <size Android:width="8dp" />
                <solid Android:color="@color/toggle_color" />
            </shape>
        </item>
    </layer-list>
</inset>

Bouton basique avec bouton personnalisé

Créez vos propres images pour deux états du bouton bascule (assurez-vous qu'elles existent pour toutes les tailles d'écrans) et placez-les dans un dossier pouvant être dessiné, créez un sélecteur et définissez-le comme bouton. 

   <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true" Android:drawable="@drawable/toggle_on" />
    <item Android:drawable="@drawable/toggle_off" />
</selector>
1
Arnav Rao

Plus d'infos sur ce lien: http://www.mokasocial.com/2011/07/sexily-styled-toggle-buttons-for-Android/

<ToggleButton 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/toggle_me"/>

et le tirable sera quelque chose comme:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true"
        Android:drawable="@drawable/toggle_me_on" /> <!-- checked -->
    <item Android:drawable="@drawable/toggle_me_off" /> <!-- default/unchecked -->
</selector>
0
Andriya