web-dev-qa-db-fra.com

ImageButton ne se met pas en surbrillance au clic avec un fond transparent

J'ai configuré un ImageButton pour être transparent, donc l'icône correspond au panneau de backgrond comme le Android ActionBar. Cela semble très bien comme je le veux.

Cependant, lorsque l'arrière-plan est transparent, il n'y a pas la surbrillance bleuâtre que vous voyez comme lorsque vous appuyez sur un bouton transparent dans la barre d'action.

Puis-je avoir un ImageButton qui est transparent et a également le flash de surbrillance lorsque vous cliquez dessus?

<ImageButton
    Android:id="@+id/nextItemButton"
    style="?android:attr/buttonStyleSmall"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentTop="true"
    Android:background="@null"
    Android:src="@drawable/ic_media_ff" />
39
Stealth Rabbi

Tout ce que vous devez faire est de définir l'arrière-plan approprié. Si vous voulez qu'il soit transparent à l'état normal et bleuâtre en appuyant sur indiqué.

Créez un StateListDrawable comme celui-ci dans res/drawable répertoire.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/my_bluish_color" Android:state_pressed="true"/>
    <item Android:drawable="@Android:color/transparent"/>
</selector>

De cette façon, l'arrière-plan par défaut est transparent. Lorsque vous appuyez dessus, l'arrière-plan a la couleur que vous avez spécifiée (au lieu de la couleur, vous pouvez utiliser n'importe quel dessin ici).

37
Tomik

J'ai rencontré ce même problème. Enfin, j'ai obtenu un exemple de code avec cet attribut:

Android:background="?android:selectableItemBackground"

Cet attribut donnera un fond transparent avec un surlignage sélectionnable à n'importe quelle vue (bouton, bouton d'image, TextView ...) SANS PLUS DE CODAGE !!!

128
Fernandez

Juste pour ajouter une bonne réponse à Fernandez:

Si vous voulez que l'effet soit rond et non rectangle, utilisez:

Android:background="?android:selectableItemBackgroundBorderless"    

(* pour V21 et plus).

5
Udi Reshef

Si vous voulez le faire par programme, voici une solution:

Créez une classe ImageButton personnalisée et remplacez drawableStateChange():

public class CustomImageButton extends ImageButton {

    @Override
    protected void drawableStateChanged() {
        Log.d("Button", "isPressed: " + isPressed() );
        if( isPressed() ){
            setBackgroundResource( Android.R.color.holo_blue_dark );
        }  else {
            setBackgroundResource( Android.R.color.transparent );
        }
        super.drawableStateChanged();

    }

    public CustomImageButton( Context context ) {
        super( context );
    }

    public CustomImageButton( Context context, AttributeSet attrs ) {
        super( context, attrs );
    }

    public CustomImageButton( Context context, AttributeSet attrs, int defStyle ) {
        super( context, attrs, defStyle );
        // TODO Auto-generated constructor stub
    }



}
2
Wenhui