sélecteur de bouton Android

115

Il s'agit d'un sélecteur de bouton tel que lorsqu'il est normal, il apparaît en rouge, lorsqu'il est enfoncé, il apparaît en gris.

Je voudrais demander comment le code pourrait-il être modifié directement de manière à ce que, une fois APPUYÉ, la taille et la couleur du texte puissent également changer? Merci beaucoup!

<item android:state_pressed="true" >         
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="@color/grey"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>    
</item>

<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="#FF6699"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>
</item>

Pearmak
la source

Réponses:

217

Vous avez juste besoin ensemble selectorde buttonvotre fichier de mise en page.

<Button
     android:id="@+id/button1"
     android:background="@drawable/selector_xml_name"
     android:layout_width="200dp"
     android:layout_height="126dp"
     android:text="Hello" />

Et.. Voila.

Éditer

Voici le button_effect.xmlfichier dans le drawablerépertoire

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

    <item android:drawable="@drawable/numpad_button_bg_selected" android:state_selected="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_pressed" android:state_pressed="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_normal"></item>

</selector>

En cela, vous pouvez voir qu'il y a 3 drawables, il vous suffit de placer ce button_effectstyle dans votre button, comme je l'ai écrit ci-dessus. Il vous suffit de remplacer selector_xml_namepar button_effect.

Chintan Rathod
la source
pourriez-vous s'il vous plaît élaborer plus sur la façon de définir l'état pressé et non pressé? (avec tous les composants ci-dessus tels que la couleur ronde, le trait, etc.). Merci beaucoup!
pearmak
La meilleure façon d'implémenter le sélecteur est d'utiliser le xml, reportez-vous à ce blazin.in/2016/03/how-to-use-selectors-for-botton.html que j'ai implémenté conformément à ceci et à son fonctionnement
Bhushan Shirsath
Salut, je sais que cela fait un moment que vous avez écrit ce post mais peut-être que vous saurez ce que je manque. J'ai utilisé votre code et mon bouton est toujours vert, alors pour pressé = vrai et sélectionné = vrai, il change de dessinable en gris mais le bouton sec avant l'ouverture d'une autre activité a le style Android par défaut. Une idée de l'état qui me manque?
volfk
27

Vous ne pouvez pas modifier la taille du texte avec une liste d'états dessinable . Pour changer la couleur et la taille du texte, procédez comme suit:

Couleur du texte

Pour modifier la couleur du texte, vous pouvez créer une ressource de liste d'état de couleur . Ce sera une ressource distincte située dans le res/color/répertoire. Dans layout xml, vous devez le définir comme valeur pour l' android:textColorattribut. Le sélecteur de couleur contiendra alors quelque chose comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/text_pressed" />
    <item android:color="@color/text_normal" />
</selector>

Taille du texte

Vous ne pouvez pas modifier la taille du texte simplement avec des ressources. Il n'y a pas de "sélecteur dimen". Vous devez le faire dans le code. Et il n'y a pas de solution simple.

La solution la plus simple pourrait probablement être d'utiliser View.onTouchListener()et de gérer les événements de montée et de descente en conséquence. Utilisez quelque chose comme ceci:

view.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // change text size to the "pressed value"
                return true;
            case MotionEvent.ACTION_UP:
                // change text size to the "normal value"
                return true;
            default:
                return false;
            }
        }
});

Une solution différente peut être d'étendre la vue et de remplacer la setPressed(Boolean)méthode. La méthode est appelée en interne lorsque le changement de l'état enfoncé se produit. Modifiez ensuite la taille du texte en conséquence dans l'appel de méthode (n'oubliez pas d'appeler le super).

Tomik
la source
14

Créer custom_selector.xml dans le dossier dessinable

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

Créer une forme selected.xml dans un dossier dessinable

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/selected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>

Créer une forme unselected.xml dans un dossier dessinable

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/unselected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>

Ajouter les couleurs suivantes pour l'état sélectionné / non sélectionné dans le dossier color.xml de valeurs

<color name="selected">#a8cf45</color>
<color name="unselected">#ff8cae3b</color>

vous pouvez vérifier la solution complète d' ici

nirav kalola
la source
2

La meilleure façon d'implémenter le sélecteur est d'utiliser le xml au lieu d'utiliser la méthode programmatique car il est plus facile à implémenter avec xml.

    <?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/button_bg_selected" android:state_selected="true"></item>
        <item android:drawable="@drawable/button_bg_pressed" android:state_pressed="true"></item>
        <item android:drawable="@drawable/button_bg_normal"></item>

    </selector>

Pour plus d'informations, j'ai implémenté en utilisant ce lien http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html

Bhushan Shirsath
la source
2

Dans le fichier Layout .xml

<Button
 android:id="@+id/button1"
 android:background="@drawable/btn_selector"
 android:layout_width="100dp"
 android:layout_height="50dp"
 android:text="press" />

btn_selector.xml

<?xml version="1.0" encoding="utf-8"?>

 <item android:drawable="@drawable/btn_bg_selected" android:state_selected="true"></item>
<item android:drawable="@drawable/btn_bg_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/btn_bg_normal"></item>

Vishal G. Gohel
la source
1

Vous pouvez utiliser ce code:

<Button
android:id="@+id/img_sublist_carat"
android:layout_width="70dp"
android:layout_height="68dp"
android:layout_centerVertical="true"
android:layout_marginLeft="625dp"
android:contentDescription=""
android:background="@drawable/img_sublist_carat_selector"
android:visibility="visible" />

(Fichier de sélection) img_sublist_carat_selector.xml:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_focused="true" 
       android:state_pressed="true"        
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:state_pressed="true" 
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:drawable="@drawable/img_sublist_carat_normal" />
</selector>
Bhaskar Kumar Singh
la source