web-dev-qa-db-fra.com

Android ImageButton avec un état sélectionné?

Si j'utilisais un ImageButton avec un sélecteur pour son arrière-plan, y a-t-il un état que je peux changer qui le fera changer d'aspect? À l'heure actuelle, je peux le faire changer d'images lorsque vous appuyez dessus, mais il semble n'y avoir aucun état "surligné", "sélectionné" ou similaire, ce qui me permet de basculer son apparence à volonté.

Voici mon XML; il ne change que l'apparence lorsqu'il est pressé.

 <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:state_pressed="false" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:state_focused="true" Android:state_pressed="true" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:state_focused="false" Android:state_pressed="true" Android:drawable="@drawable/map_toolbar_details_selected" />
<item Android:drawable="@drawable/map_toolbar_details" />
78
Joren

Cela fonctionne pour moi:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
    <item 
        Android:state_selected="true" 
        Android:drawable="@drawable/info_icon_solid_with_shadow" />
    <item 
        Android:drawable="@drawable/info_icon_outline_with_shadow" />
 </selector>

Et puis en Java:

//assign the image in code (or you can do this in your layout xml with the src attribute)
imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....));

//set the click listener
imageButton.setOnClickListener(new OnClickListener() {

    public void onClick(View button) {
        //Set the button's appearance
        button.setSelected(!button.isSelected());

        if (button.isSelected()) {
            //Handle selected state change
        } else {
            //Handle de-select state change
        }

    }

});

Pour une transition en douceur, vous pouvez également mentionner le temps d'animation:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:exitFadeDuration="@Android:integer/config_mediumAnimTime">
199
joshrl

ToggleImageButton qui implémente l'interface Checkable et supporte OnCheckedChangeListener et Android:checked attribut xml:

public class ToggleImageButton extends ImageButton implements Checkable {
    private OnCheckedChangeListener onCheckedChangeListener;

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

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

    public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setChecked(attrs);
    }

    private void setChecked(AttributeSet attrs) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton);
        setChecked(a.getBoolean(R.styleable.ToggleImageButton_Android_checked, false));
        a.recycle();
    }

    @Override
    public boolean isChecked() {
        return isSelected();
    }

    @Override
    public void setChecked(boolean checked) {
        setSelected(checked);

        if (onCheckedChangeListener != null) {
            onCheckedChangeListener.onCheckedChanged(this, checked);
        }
    }

    @Override
    public void toggle() {
        setChecked(!isChecked());
    }

    @Override
    public boolean performClick() {
        toggle();
        return super.performClick();
    }

    public OnCheckedChangeListener getOnCheckedChangeListener() {
        return onCheckedChangeListener;
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        this.onCheckedChangeListener = onCheckedChangeListener;
    }

    public static interface OnCheckedChangeListener {
        public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked);
    }
}

res/values ​​/ attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ToggleImageButton">
        <attr name="Android:checked" />
    </declare-styleable>
</resources>
16
vokilam

La meilleure façon de faire cela sans plus d'images:

public static void buttonEffect(View button){
    button.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }
            return false;
        }
    });
}
9
András

Essaye ça:

 <item
   Android:state_focused="true"
   Android:state_enabled="true"
   Android:drawable="@drawable/map_toolbar_details_selected" />

Aussi pour les couleurs j'ai eu du succès avec

<selector
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <item
            Android:state_selected="true"

            Android:color="@color/primary_color" />
        <item
            Android:color="@color/secondary_color" />
</selector>
2
Alex Volovoy

Créez un fichier XML dans un dossier res/drawable. Par exemple, "btn_image.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/bg_state_1"
          Android:state_pressed="true"
          Android:state_selected="true"/>
    <item Android:drawable="@drawable/bg_state_2"
          Android:state_pressed="true"
          Android:state_selected="false"/>
    <item Android:drawable="@drawable/bg_state_selected"
          Android:state_selected="true"/>
    <item Android:drawable="@drawable/bg_state_deselected"/>
</selector>

Vous pouvez combiner les fichiers de votre choix. Par exemple, remplacez "bg_state_1" par "bg_state_deselected" et "bg_state_2" par "bg_state_selected".

Dans n'importe lequel de ces fichiers, vous pouvez écrire quelque chose comme:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:shape="rectangle">
    <solid Android:color="#ccdd00"/>
    <corners Android:radius="5dp"/>
</shape>

Créez dans un fichier de mise en page un ImageView ou ImageButton avec les attributs suivants:

<ImageView
    Android:id="@+id/image"
    Android:layout_width="50dp"
    Android:layout_height="50dp"
    Android:adjustViewBounds="true"
    Android:background="@drawable/btn_image"
    Android:padding="10dp"
    Android:scaleType="fitCenter"
    Android:src="@drawable/star"/>

Plus tard dans le code:

image.setSelected(!image.isSelected());
2
CoolMind