94 votes

Comment appliquer simultanément une forme et un sélecteur à un bouton ?

J'ai appliqué une forme pour un bouton comme :

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

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >
    <gradient android:startColor="#DD000000" android:endColor="#DD2d2d2d"  android:angle="90"></gradient>
    <corners android:radius="15dip"></corners>

</shape>

Maintenant, je veux utiliser un sélecteur comme :

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

pour ce bouton également. Est-ce possible ?

200voto

hanry Points 2763

Utiliser de cette manière :

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

   <item android:state_pressed="true" >
       <shape>.......</shape>
   </item>
   ..........
   ..........
</selector>

8 votes

Oui, cela a fonctionné en utilisant : <selector xmlns:Android=" schemas.Android.com/apk/res/Android "> <item Android:state_pressed="true" > <shape Android:shape="rectangle" > <corners Android:radius="15dip"></corners> <solid Android:color="#febd26"/> </shape> </item> <shape Android : shape="rectangle" > <gradient Android:startColor="#DD000000" Android:endColor="#DD2d2d2d" Android:angle="90"></gradient> <corners Android:radius="15dip"></corners> </shape> </item> </selector>

7 votes

@KhawarRaza A l'avenir, veuillez mettre des informations comme celles-ci dans votre question où il peut être formaté et retrouvé plus facilement. Les commentaires ont tendance à disparaître avec le temps.

0 votes

J'ai essayé d'ajouter un élément de forme à l'intérieur de l'élément d'objet comme vous l'avez suggéré, mais il y a un message d'erreur qui n'est pas très utile. 09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>. Je définis le sélecteur comme étant le android:background de l'attribut RoundedImageView [ [github.com/vinc3m1/RoundedImageView#usage]](https://github.com/vinc3m1/RoundedImageView#usage]) . Quelqu'un a-t-il une idée de la façon de procéder ?

25voto

AZ_ Points 7127

Réponse détaillée et précise

Créer une ressource couleur dans

res/values/colors.xml

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

    <item name="yellow" type="color">#F7B500</item>
    <item name="yellow_dark" type="color">#AC7E00</item>

    <integer-array name="androidcolors">
        <item>@color/yellow</item>
        <item>@color/yellow_dark</item>
    </integer-array>

</resources>

Créer un objet à dessiner à

res/drawable/bg_yellow_round.xml

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

    <solid android:color="@color/yellow" />

    <stroke
        android:width="2dp"
        android:color="@color/yellow" />

    <corners
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp"
        android:topLeftRadius="20dp"
        android:topRightRadius="20dp" />

</shape>

Créez un autre objet dessiné, que vous voulez pour la transition au même endroit, et nommez-le

res/drawable/bg_yellow_dark_round.xml

<solid android:color="@color/yellow_dark" />

<stroke
    android:width="2dp"
    android:color="@color/yellow_dark" />

<corners
    android:bottomLeftRadius="20dp"
    android:bottomRightRadius="20dp"
    android:topLeftRadius="20dp"
    android:topRightRadius="20dp" />

Créez maintenant un liste des états de couleur à

res/color/btn_selector_yellow.xml

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

    <item android:drawable="@color/yellow" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@drawable/bg_yellow_dark_round" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_yellow_round"/>

</selector>

Définissez ensuite votre bouton comme suit

<Button
                android:id="@+id/button1"
                android:layout_width="248dp"
                android:layout_height="44dp"
                android:layout_gravity="center_horizontal"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="20dp"
                android:background="@color/btn_selector_yellow"
                android:text="AZ_ is so cool" />

Maintenant, cela fera la transition de light yellow

à

dark yellow .

13voto

Renan Bandeira Points 888

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/star_off"/>
    <corners android:radius="5dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">

    <item android:drawable="@color/tab_focused" android:state_focused="true" android:state_pressed="false"/>
    <item android:drawable="@color/tab_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/shape"/>

</selector>

1 votes

Utiliser @drawable/shape au lieu de @drawable/shape.xml

8voto

Till Points 1283

Vous pouvez également créer une forme qui utilise un sélecteur à l'intérieur. Si votre forme ne fait que changer de couleur dans différents états, c'est beaucoup plus propre.

color/color_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue_dark" android:state_pressed="true" />
    <item android:color="@color/blue_light" />
</selector>

dessin/forme.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/color_selector" />
    <corners android:bottomLeftRadius="6dip" android:bottomRightRadius="6dp" />
    <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip" />
</shape>

0 votes

Cela ne fonctionne pas pour moi, le sélecteur de couleur n'est jamais utilisé... Bien que je sois d'accord pour dire que c'est beaucoup plus propre

0 votes

3 votes

Je sais que c'est vieux, mais pour information, cette méthode ne fonctionne qu'avec Android 5.0 et plus.

4voto

Nouman Ghaffar Points 1919

Je sais qu'il est bien trop tard Mais voici un exemple résolu

 <TextView
            android:id="@+id/txt_out_going_calls"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="04dp"
            android:layout_weight="1"
            android:background="@drawable/header_text_view_selector"
            android:gravity="center"
            android:text="@string/outgoing_calls_tab_button_text"
            android:textColor="@color/home_text_color" />

et mon header_text_view_selector

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

        <shape xmlns:android="http://schemas.android.com/apk/res/android">
            <solid android:color="@color/home_fragment_tab_color_selected"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
    <item android:state_selected="false">

        <shape>
            <solid android:color="@color/home_fragment_tab_color_simple"/>
            <corners android:radius="25dip" />
            <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
        </shape>
    </item>
</selector>

En fait, je suis en train de créer un textview avec sélecteur. Ici, je ne m'occupe que de state_selected y not_selected . J'espère que cela vous aidera

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