Android ImageButton с отключенным интерфейсом

У меня есть ImageButton, который отключен (не доступен для кликов или установлен как отключенный). Я хочу дать пользователю пользовательский интерфейс, чтобы он отключился без использования какого-либо другого изображения.

Есть какой-либо способ сделать это?

Solutions Collecting From Web of "Android ImageButton с отключенным интерфейсом"

В отличие от обычной Button , ImageButton или Button , у которого есть фон изображения, не отображается серым цветом при отключении. Вы действительно должны использовать другое изображение или обрабатывать его таким образом, чтобы оно выглядело серым.

Если использовать другое изображение в порядке, вы можете сделать это, используя <selector> (здесь связанный с обычной Button но это среди того же):

  • /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> 

Обратите внимание, что в селекторе логика применяет последовательный путь, элемент для каждого элемента. Здесь button_red используется все время, но когда кнопка отключена или нажата.

  • Ваш 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" /> 

И если использование другого изображения будет проблемой, другие ответы (например, @ Tronman's или @ southerton's) дают вам способы программно обрабатывать изображение так, как будто оно выглядит серым.

@ Oleg Vaskevich дал другое решение проблемы здесь: отключить ImageButton

Его решение позволяет вам вычеркнуть ImageButton без создания дополнительных изображений или с помощью <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; } 

Вы можете установить его без кликабельности, а также настроить альфа, чтобы показать это чувство, о котором вы говорите.

Разрабатывая ответ @tronman, вы также можете создать функцию, которая будет серировать динамически загружаемые чертежи (т. Е. Не из ресурса, например, загруженные из сырых файлов SVG и преобразованные в BitmapDrawables «на лету»).

 /** * 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); } 

Если у вас также есть непрозрачная рамка на фоне (установленная с андроидом: фон), обратитесь к селекторам Android: Как сделать Drawable Selector, чтобы также изменить фон.

Я предпочел переопределить метод setEnabled() в ImageButton, чтобы соответствующим образом изменить альфа-свойство изображения. Поэтому, когда кнопка отключена, изображение будет частично прозрачным и более нечувствительным.

 public class CustomImageButton extends ImageButton { //... @Override public void setEnabled(boolean enabled) { if(this.isEnabled() != enabled) { this.setImageAlpha(enabled ? 0xFF : 0x3F); } super.setEnabled(enabled); } } 

Нет, ваше изображение является дифференцирующим фактором .. поэтому, если вы не хотите менять изображение, вы не можете определить, отключена ли кнопка изображения, включена ли нажата.