2011-08-29 16 views
32

Ho un ImageButton che è disabilitato (non selezionabile o impostato come disabilitato). Voglio dare all'utente un'interfaccia utente che sia disabilitato senza usare altre immagini.Android ImageButton con UI disabilitato

C'è un modo per farlo?

+0

Vuoi dire vuoi che il framework Android lo oscuri o qualcosa del genere se lo disabiliti? – C0deAttack

+0

sì. Voglio esattamente lo stesso –

+0

C0deAttack qualche idea ..? –

risposta

49

A differenza di un normale Button, uno ImageButton o uno Button con uno sfondo di immagine non è disattivato se disabilitato. In realtà devi usare un'altra immagine o elaborarla in modo che appaia in grigio.

deve Usare un'altra immagine ok, è possibile farlo utilizzando un <selector> (qui associata ad una regolare Button ma questo amongs allo stesso):

  • /drawable/my_selector.xml:

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
        <item android:state_enabled="false" 
         android:drawable="@drawable/button_gray" /> ***button_gray is a Drawable image*** 
        <item android:state_pressed="true" 
         android:drawable="@drawable/button_gray" /> 
        <item android:drawable="@drawable/button_red" /> ***button_red is a Drawable image*** 
    </selector> 
    

Si prega di notare che in un selettore la logica applica un modo sequenziale, oggetto per articolo. Qui, button_red viene utilizzato tutto il tempo ma quando il pulsante è disattivato o viene premuto.

  • tuo layout.xml:

    <Button android:id="@+id/myButton" 
         android:background="@drawable/my_selector" ***this is a reference to the selector above *** 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
    /> 
    

E dovrebbe utilizzando un'altra immagine essere un problema, altre risposte (come @ Tronman del o @ di Southerton) offrono modi per elaborare a livello di codice l'immagine in un modo in cui appare in grigio.

+1

+1 per la risposta :) questo è stato davvero utile :) – Deepthi

+0

C'è un altro modo. Vedi la mia soluzione qui sotto. – tronman

+0

Ho trovato che l'ordine dell'elemento è importante in my_selector. L'elemento di state_enabled = "false" deve essere messo prima di quello predefinito. –

-2

No, la vostra immagine è la differenziazione fattore .. quindi se non si vuole cambiare l'immagine, allora si può non dire se il pulsante dell'immagine è disabilitata, abilitata, pressato.

3

È possibile impostarlo su non selezionabile e impostare anche l'alfa per mostrare quella sensazione che si menziona.

28

@Oleg Vaskevich ha dato una diversa soluzione al problema qui: Disable an ImageButton

La sua soluzione permette di grigio-out un ImageButton senza creare ulteriori immagini o utilizzando un <selector>.

/** 
* Sets the image button to the given state and grays-out the icon. 
* 
* @param enabled The state of the button 
* @param item The button item to modify 
* @param iconResId The button's icon ID 
*/ 
public static void setImageButtonEnabled(Context ctxt, boolean enabled, 
     ImageButton item, int iconResId) { 

    item.setEnabled(enabled); 
    Drawable originalIcon = ctxt.getResources().getDrawable(iconResId); 
    Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon); 
    item.setImageDrawable(icon); 
} 

/** 
* Mutates and applies a filter that converts the given drawable to a Gray 
* image. This method may be used to simulate the color of disable icons in 
* Honeycomb's ActionBar. 
* 
* @return a mutated version of the given drawable with a color filter applied. 
*/ 
public static Drawable convertDrawableToGrayScale(Drawable drawable) { 
    if (drawable == null) 
     return null; 

    Drawable res = drawable.mutate(); 
    res.setColorFilter(Color.GRAY, Mode.SRC_IN); 
    return res; 
} 
+3

Questa è la migliore risposta perché risponde all'esigenza dell'op di non utilizzare altre immagini. Grazie per la soluzione. –

+0

Grazie mille! Ottima risposta – DmitryKanunnikoff

+0

Sì, ottima soluzione! – FractalBob

4

Sviluppando risposta @tronman si può anche comporre una funzione che in grigio drawable caricate dinamicamente (cioè non da risorse, - ad esempio caricati da file SVG prime e convertito BitmapDrawables al volo).

/** 
* Sets the specified image buttonto the given state, while modifying or 
* "graying-out" the icon as well 
* 
* @param enabled The state of the menu item 
* @param item The menu item to modify 
* @param originalIcon The drawable 
*/ 
public static void setImageButtonEnabled(Context ctxt, boolean enabled, ImageButton item, Drawable originalIcon) { 
    item.setEnabled(enabled); 

    Drawable res = originalIcon.mutate(); 
    if (enabled) 
     res.setColorFilter(null); 
    else 
     res.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN); 
} 

Se anche voi avete un disegnabile non trasparente su sfondo (impostato con Android: sfondo) si riferiscono ai selettori Android: How to Make A Drawable Selector modificare anche sfondo.

1

Ho preferito ignorare il metodo setEnabled() in ImageButton per modificare di conseguenza la proprietà alpha dell'immagine. Quindi, quando il pulsante è disabilitato, l'immagine sarà parzialmente trasparente e più disabilitata.

public class CustomImageButton extends ImageButton { 
    //... 

    @Override 
    public void setEnabled(boolean enabled) { 
     if(this.isEnabled() != enabled) { 
      this.setImageAlpha(enabled ? 0xFF : 0x3F); 
     } 
     super.setEnabled(enabled); 
    } 
} 
0
public static void setImageButtonEnabled(@NonNull final ImageView imageView, 
             final boolean enabled) { 
    imageView.setEnabled(enabled); 
    imageView.setAlpha(enabled ? 1.0f : 0.3f); 

    final Drawable originalIcon = imageView.getDrawable(); 
    final Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon); 
    imageView.setImageDrawable(icon); 
} 

private static Drawable convertDrawableToGrayScale(@NonNull Drawable drawable) { 
    final ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 
    final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 

    final Drawable mutated = drawable.mutate(); 
    mutated.setColorFilter(filter); 

    return mutated; 
} 

Se si utilizza Kotlin, è possibile creare una funzione di estensione, invece, in modo che appaia più elegante:

fun ImageView.setImageButtonEnabled(enabled: Boolean){ 
    //Above implementation here 
} 

e chiamare utilizzando:

yourImageView.setImageButtonEnabled(true/false) 
Problemi correlati