Wie wende ich Form und Auswahl gleichzeitig für Button an?


82

Ich habe eine Form für einen Knopf angewendet wie:

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

Jetzt möchte ich einen Selektor verwenden wie:

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

auch für diesen Button. Ist es möglich ...???

Antworten:


184

Verwenden Sie diesen Weg:

<?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
Ja, es hat funktioniert mit: <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_pressed = "true"> <shape android: shape = "rechteck"> <Ecken android : radius = "15dip"> </ corners> <solid android: color = "# febd26" /> </ shape> </ item> <item> <shape android: shape = "rechteck"> <gradient android: startColor = "# DD000000" android: endColor = "# DD2d2d2d" android: angle = "90"> </ gradient> <Ecken android: radius = "15dip"> </ Ecken> </ form> </ item> </ selector>
Khawar Raza

6
@KhawarRaza Bitte geben Sie in Zukunft solche Informationen in Ihre Frage ein , wo sie formatiert und leichter gefunden werden können. Kommentare verschwinden im Laufe der Zeit.
Tim Post

Ich habe versucht, ein Formelement in das Elementelement einzufügen, wie Sie vorgeschlagen haben, aber es tritt nur ein Fehler mit einer Meldung auf, die nicht viel hilft. 09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>. Ich setze den Selektor als android:backgroundAttribut eines RoundedImageView[ github.com/vinc3m1/RoundedImageView#usage] . Hat jemand eine Idee, wie man das macht?
toobsco42

Beim Versuch, diese Technik zu verwenden, wurde immer wieder eine Fehlermeldung angezeigt. Die Antwort von AZ_ hat bei mir besser funktioniert.
Alan Nelson

@ Alan Nelson, meine Antwort ist nur Skelett, während AZ_ das Beispiel gegeben hat.
Hanry

26

Detaillierte Antwort auf den Punkt

Erstellen Sie eine Farbressource in

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>

Erstellen Sie ein Drawable bei

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>

Erstellen Sie ein weiteres Zeichen, das Sie für den Übergang an derselben Stelle verwenden möchten, und benennen Sie es

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" />

Erstellen Sie nun eine Farbstatusliste unter

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>

Stellen Sie es nun wie folgt auf Ihre Schaltfläche ein

<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" />

Nun wird dies Übergang von tun hellgelb

zu

dunkelgelb.


Dies funktioniert. Können Sie auch eine Anleitung zur Implementierung für den Ripple-Effekt geben?
Hardik9850


oder sehen Sie einfach, dass es viele google.com/…
AZ_ gibt

10

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
Verwenden Sie @ drawable / shape anstelle von @ drawable / shape.xml
Khizar Hayat

4

Sie können auch eine Form erstellen, die einen Selektor im Inneren verwendet. Wenn Ihre Form nur ihre Farbe in verschiedenen Zuständen ändert, ist dies viel sauberer.

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>

Dies funktioniert nicht für mich, der Selektor in Farbe wird nie verwendet ... Obwohl ich damit einverstanden bin, ist es viel sauberer
Gyome


3
Ich weiß, dass dies alt ist, aber nur zur Veranschaulichung, diese Methode funktioniert nur in Android 5.0 und höher.
Löwen schreiben

4

Nun, ich weiß, es ist viel zu spät. Aber hier ist ein gelöstes Beispiel

 <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" />

und mein 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>

Im Grunde genommen erstelle ich einen abgerundeten textviewSelektor. Hier bin ich nur im Umgang state_selectedund not_selected. Ich hoffe es hilft


3

Das ist mein Weg und es funktioniert!

<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>


1

Mein Beispiel ist eine Kreistaste mit state_pressed. Code unten:

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

Um wiederverwendbarer zu sein, können Sie Status für einzelne Eigenschaften festlegen. Vermeiden Sie das Duplizieren Ihrer Formen

<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>

Ich konnte den Hintergrund programmgesteuert einstellen, nachdem ich ihn mit dieser Methode deaktiviert hatte.


0

Verwenden Sie Ihren Formnamen, wenn Sie ein Bild verwenden, und verwenden Sie den Selektor, wenn Sie ein Bild verwenden. Probieren Sie es aus, Sie werden kein Problem haben. Haben Sie das gefragt?


2
Setzen Sie Ihre Form xml in drawable und übergeben Sie es android: drawable = "@ drawable / shape_xml" in Ihrem Selektor und verwenden Sie Ihren Selektor in Ihrer Ansicht ....
Vineet Shukla

1
Bitte schreiben Sie Ihr Beispiel in einer besseren Form mit Code-Snippet.
Roy Lee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.