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?
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?
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.
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.
È possibile impostarlo su non selezionabile e impostare anche l'alfa per mostrare quella sensazione che si menziona.
@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;
}
Questa è la migliore risposta perché risponde all'esigenza dell'op di non utilizzare altre immagini. Grazie per la soluzione. –
Grazie mille! Ottima risposta – DmitryKanunnikoff
Sì, ottima soluzione! – FractalBob
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.
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);
}
}
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)
Vuoi dire vuoi che il framework Android lo oscuri o qualcosa del genere se lo disabiliti? – C0deAttack
sì. Voglio esattamente lo stesso –
C0deAttack qualche idea ..? –