web-dev-qa-db-fra.com

Comment appliquer simultanément la forme et le sélecteur pour Button?

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. C'est possible ...???

74
Khawar Raza

utilisez de cette façon:

<?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>
171
Hanry

Détaillé au point de réponse

Créer une ressource couleur dans

res/values ​​/ colours.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éez un dessinable à

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 dessinable, vous voulez une 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" />

Maintenant, créez un liste d'état des couleurs à

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>

Maintenant, réglez-le sur 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.

25
AZ_

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>
10
Renan Bandeira

Vous pouvez également créer une forme qui utilise un sélecteur à l'intérieur. Si votre forme change simplement 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>

drawable/shape.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>
4
Till

C'est ma voie, et ça marche!

<item Android:state_pressed="true">

    <shape Android:shape="oval">


        <gradient Android:centerX=".6"
            Android:centerY=".40"
            Android:endColor="@color/colorPrimary"
            Android:gradientRadius="20"
            Android:startColor="@color/colorPrimary"
            Android:type="radial" />

        <stroke Android:width="1dp"
            Android:color="#FFFFFF" />

        <size Android:width="55dp"
            Android:height="55dp" />

    </shape>
</item>

<item Android:state_focused="false">
    <shape Android:shape="oval">


        <gradient Android:centerX=".6"
            Android:centerY=".40"
            Android:endColor="@Android:color/transparent"
            Android:gradientRadius="20"
            Android:startColor="@Android:color/transparent"
            Android:type="radial" />

        <stroke Android:width="1dp"
            Android:color="#FFFFFF" />

        <size Android:width="55dp"
            Android:height="55dp" />

    </shape>
</item>
3
user3530687

Pour être plus réutilisable, vous pouvez définir des états sur des propriétés uniques. Évitez de dupliquer vos formes

<selector
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
>
    <item>
        <shape Android:shape="rectangle" >
            <corners Android:radius="5dp"/>
            <solid
                Android:state_enabled="false"
                Android:color="@color/transparent"
            />
            <solid
                Android:state_enabled="true"
                Android:color="@color/background"
            />
            <stroke
                Android:width="@dimen/dividerHeight"
                Android:color="@color/dividerLight"
            />
        </shape>
    </item>
</selector>

J'ai pu définir l'arrière-plan par programme une fois désactivé en utilisant cette méthode.

1
Gibolt

Mon exemple est un bouton circulaire avec state_pressed. ci-dessous:

<?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="oval">
            <solid Android:color="@color/light_primary_color" />
        </shape>

    </item>
    <item>
        <shape Android:shape="oval">
            <solid Android:color="@color/accent_color" />
        </shape>
    </item>

</selector>
1
vrbsm

Eh bien, je sais qu'il est 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>

Donc, fondamentalement, je crée un textview arrondi avec sélecteur. Ici, je gère uniquement state_selected et not_selected. J'espère que ça aide

1
Nouman Ghaffar

Utilisez votre nom de forme lorsque vous utilisez une image et utilisez-le comme vous utilisez l'image. Essayez, vous ne rencontrerez aucun problème. C'est bien ce que vous demandiez?

0
Vineet Shukla