2010-10-04 2 views
2

J'essaie de supprimer l'arrière-plan d'un ImageButton uniquement dans l'état par défaut. Je voudrais que les états pressés et sélectionnés se comportent comme d'habitude pour qu'ils soient corrects sur les différents appareils, qui utilisent des couleurs différentes pour les états pressés et sélectionnés.Comment modifier l'état du bouton par défaut dans Android sans affecter les états pressés et sélectionnés?

Est-il possible de définir l'état par défaut d'un état ImageButton sans affecter les états pressés et sélectionnés?

J'ai essayé de faire cela avec un sélecteur, mais cela ne semble pas vous permettre d'utiliser les drawables par défaut pour certains états - vous devez régler vous-même tous les états. Comme il n'y a pas d'API pour récupérer les tirages par défaut/sélectionnés par défaut du périphérique, je ne sais pas à quoi les états pressés/sélectionnés doivent être définis.

J'ai également essayé d'obtenir l'objet StateListDrawable pour le bouton que le système crée lorsque vous n'utilisez pas de sélecteur, puis de le modifier pour changer l'état par défaut. Cela n'a pas fonctionné non plus.

Il semble que sur Android, si vous voulez changer le drawable pour un état d'un bouton, alors vous devez définir tous les états, et ne peut donc pas conserver les drawables par défaut pour les autres états. Est-ce correct?

Merci! -Tom B.

Répondre

4

Tom,

Il est vrai que si vous remplacez l'état par défaut, vous devez également remplacer les états pressés et ciblés. La raison en est que le drawable android par défaut est un sélecteur, et donc le surcharger avec un drawable statique signifie que vous perdez l'information d'état pour les états pressés et focalisés car vous n'avez qu'un seul drawable spécifié pour cela. Cependant, il est très facile d'implémenter un sélecteur personnalisé. Faites quelque chose comme ceci:

<selector 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/custombutton"> 

    <item 
     android:state_focused="true" 
     android:drawable="@drawable/focused_button" /> 
    <item 
     android:state_pressed="true" 
     android:drawable="@drawable/pressed_button" /> 
    <item 
     android:state_pressed="false" 
     android:state_focused="false" 
     android:drawable="@drawable/normal_button" /> 
</selector> 

Mettre cela dans votre répertoire dessinables, et le charger comme un drawable normal pour l'arrière-plan de la ImageButton. Le plus dur pour moi est de concevoir les images réelles.

Edit:

juste fait quelques recherches dans la source de EditText, et voici comment ils ont mis le drawable de fond:

public EditText(/*Context context, AttributeSet attrs, int defStyle*/) { 
    super(/*context, attrs, defStyle*/); 

      StateListDrawable mStateContainer = new StateListDrawable(); 

      ShapeDrawable pressedDrawable = new ShapeDrawable(new RoundRectShape(10,10)); 
      pressedDrawable.getPaint().setStyle(Paint.FILL); 
      pressedDrawable.getPaint().setColor(0xEDEFF1); 


      ShapeDrawable focusedDrawable = new ShapeDrawable(new RoundRectShape(10,10)); 
      focusedDrawable.getPaint().setStyle(Paint.FILL); 
      focusedDrawable.getPaint().setColor(0x5A8AC1); 

      ShapeDrawable defaultDrawable = new ShapeDrawable(new RoundRectShape(10,10)); 
      defaultDrawable.getPaint().setStyle(Paint.FILL); 
      defaultDrawable.getPaint().setColor(Color.GRAY); 



      mStateContainer.addState(View.PRESSED_STATE_SET, pressedDrawable); 
      mStateContainer.addState(View.FOCUSED_STATE_SET, focusedDrawable); 
      mStateContainer.addState(StateSet.WILD_CARD, defaultDrawable); 

      this.setBackgroundDrawable(mStateContainer); 
} 

Je suis sûr que vous pouvez adapter l'idée à vos besoins. Voici la page Je l'ai trouvé sur:

http://www.google.com/codesearch/p?hl=en#ML2Ie1A679g/src/android/widget/EditText.java

+0

Merci pour votre réponse Dan. Cela répond à ma question spécifique, à savoir si vous devez fournir tous les états de sélection, ce que vous faites malheureusement. Il semble que le système d'exploitation code les couleurs pressées/sélectionnées en fonction de la source EditText que vous avez affichée. Je vais poser une question distincte à savoir s'il est possible pour une application de comprendre quelles sont les couleurs pressées/sélectionnées par défaut sur un appareil. – tombz

0
StateListDrawable replace = new StateListDrawable(); 

Drawable old = getBackground(); 
replace.addState(FOCUSED_STATE_SET, old); 
replace.addState(SELECTED_STATE_SET, old); 
replace.addState(PRESSED_STATE_SET, old); 

replace.addState(StateSet.WILD_CARD, new ColorDrawable(Color.TRANSPARENT)); 

if (Build.VERSION.SDK_INT >= 16) { 
    setBackground(replace); 
} else { 
    setBackgroundDrawable(replace); 
} 
Questions connexes