State list drawable und disabled state

Lesezeit: 4 Minuten

Ich habe eine Schaltfläche und möchte, dass sie einen anderen Hintergrund hat, wenn ich sie einstelle:

android:enabled="false"

Hier ist die Ressourcendatei für den Hintergrund:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false"
          android:drawable="@drawable/bttn_orange_normal" /> <!-- pressed -->
    <item android:state_pressed="true"
          android:drawable="@drawable/bttn_orange_selected" /> <!-- focused -->
    <item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>
    <item android:state_enabled="true" android:drawable="@drawable/bttn_orange_normal"/>
</selector>

Die Schaltfläche hat jedoch immer noch einen normalen Hintergrund, wenn sie deaktiviert ist. Was vermisse ich?

  • Versuchen Sie, den ersten Artikelabschnitt hinzuzufügen android:state_enabled=”true”

    – Georgy Gobozov

    26. Dezember 2012 um 15:56 Uhr

  • pressed false wird nicht gedrückt. Auch das Fehlen eines Zustands bedeutet nicht falsch. es bedeutet, dass es nicht berücksichtigt wird. Ihre Regel hier bedeutet also, dass jedes Mal, wenn eine Taste nicht gedrückt wird, das normale BG angezeigt wird.

    – njzk2

    26. Dezember 2012 um 16:14 Uhr

  • Sie müssen die löschen android:state_enabled=”true” des letzten Artikels, so haben alle anderen Status den @drawable/bttn_orange_normal. Sobald Ihre Schaltfläche deaktiviert ist, wird sie die erhalten @drawable/bttn_grey_disabled am richtigen Platz. Außerdem müssen Sie die Zeile mit dem entfernen android:state_pressed=”false” weil es die Definition von außer Kraft setzen wird android:state_enabled=”false”

    – alexscmar

    21. Dezember 2015 um 10:32 Uhr

Benutzer-Avatar
Vinzenz Ducastel

Setzen Sie diese Zeile:

<item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>

wie Erster Gegenstand (es muss der erste Eintrag sein, sonst funktioniert es nicht) der selector Schild.

Finale:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/>
            <item android:state_pressed="false"
              android:drawable="@drawable/bttn_orange_normal" /> <!-- pressed -->
            <item android:state_pressed="true"
              android:drawable="@drawable/bttn_orange_selected" /> <!-- focused -->
            <item android:state_enabled="true" android:drawable="@drawable/bttn_orange_normal"/> <!-- idle state -->
</selector>

  • @Estel Ich denke nicht, dass es eine verrückte dumme Regel ist. Stellen Sie sich den Selektor als Schaltergehäuse vor. Betrachten Sie jedes Element innerhalb des Selektors als eine “Case”-Anweisung mit “break” am Ende. Der erste Artikel ist: <item android:state_pressed="false" android:drawable="@drawable/bttn_orange_normal" /> das stimmt, der normale Hintergrund wird gesetzt.

    – Versengt

    19. Mai 2015 um 9:01 Uhr

Benutzer-Avatar
Das es

Die Antwort von Vincent Ducastel ist richtig, beschreibt sie jedoch nicht warum die Lösung funktioniert.

Wenn Android die Liste der verfügbaren Elemente durchläuft, durchläuft es die Liste von oben nach unten und bewertet in jedem Fall, ob der aktuelle Zustand der Ansicht mit den für jedes Element definierten Zuständen übereinstimmt. Es dann wählt das erste Element aus, das den Bedingungen entspricht und ignoriert den Rest.

Aus diesem Grund sollten Sie immer ein Standardelement am Ende der Liste bereitstellen und bietet auch die Möglichkeit, komplexe Auswahlbedingungen anzuzeigen. Wenn Sie beispielsweise einen speziellen gedrückten Zustand haben möchten, wenn das Element deaktiviert ist, würden Sie die folgenden Elemente definieren:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    ...
    <item android:state_enabled="false" android:state_pressed="false" android:drawable="@drawable/btn_grey_disabled"/>
    <item android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/btn_white_disabled_selected"/>
    ...
</selector>

Beispiel hinzugefügt Aktiv, Standard und Deaktiviert Bundesland

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

    <!--Disable-->
    <item android:drawable="@drawable/ic_button_disable"
        android:state_enabled="false" 
        android:state_pressed="false" />

    <item android:drawable="@drawable/ic_button_disable_touch" 
        android:state_enabled="false" 
        android:state_pressed="true" />


    <!--Default-->
    <item android:drawable="@drawable/ic_button_default"  
        android:state_pressed="false"    
        android:state_selected="false" />

    <item android:drawable="@drawable/ic_button_default_touch" 
        android:state_pressed="true" 
        android:state_selected="false"  />


    <!--Active-->
    <item android:drawable="@drawable/ic_button_active" 
        android:state_enabled="true" 
        android:state_selected="true" 
        android:state_pressed="false" />

    <item android:drawable="@drawable/ic_button_active_touch" 
        android:state_enabled="true" 
        android:state_pressed="true" 
        android:state_selected="true" />
</selector>

1169530cookie-checkState list drawable und disabled state

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy