2012-12-26 8 views
32

Ich haben einen Knopf, und ich möchte es anderen Hintergrund hat, wenn ich gesetzt:Staat Liste ziehbar und deaktivierten Zustand

android:enabled="false" 

Hier Ressource-Datei für den Hintergrund sind:

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

Aber Taste hat noch normal Hintergrund, wenn es deaktiviert ist. Was fehlt mir?

+2

Versuch hinzufügen auf dem ersten Artikel Abschnitt android: nicht gedrückt state_enabled = „true“ –

+0

gedrückt false . Auch bedeutet das nicht, einen Staat zu spezifizieren, auch nicht falsch. Es bedeutet, dass es nicht berücksichtigt wird. Also, Ihre Regel bedeutet hier jedes Mal, wenn ein Knopf nicht gedrückt wird, hat es das normale bg. – njzk2

+0

Sie müssen den ** android: state_enabled = "true" ** des letzten Elements löschen, so dass alle anderen Status die ** @ drawable/bttn_orange_normal ** haben. Sobald die Schaltfläche deaktiviert ist, wird das ** @ drawable/bttn_grey_disabled ** an der richtigen Stelle angezeigt. Außerdem müssen Sie die Zeile mit dem ** android: state_pressed = "false" ** entfernen, da sie die Definition von *** android überschreibt: state_enabled = "false" *** – alexscmar

Antwort

97

Diese Linie: <item android:state_enabled="false" android:drawable="@drawable/bttn_grey_disabled"/> als erstes Element (es erstes Element sein muss, sonst wird es nicht funktionieren) des selector-Tag.

Final:

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

Warum ist das !? Verrückte dumme Regel:/ – Estel

+1

warum funktioniert es ???? danke trotzdem – Orr

+1

was ist das? Aus welchem ​​Grund ... es funktioniert für mich. –

16

Vincent Ducastel Antwort ist richtig, aber es ist nicht beschreibt, 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 dabei jeweils, ob der aktuelle Zustand der Ansicht mit den für jedes Element definierten Zuständen übereinstimmt. Dann wählt das erste Element aus, das den Bedingungen entspricht, und ignoriert den Rest.

Aus diesem Grund sollten Sie immer einen Standardeintrag am Ende der Liste angeben und auch komplexe Auswahlbedingungen anzeigen. Zum Beispiel, wenn Sie wollen einen besonderen gedrückten Zustand, wenn das Element deaktiviert ist, würden Sie folgende 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> 
Verwandte Themen