禁用ImageButton

这看起来很容易,但我无法禁用ImageButton 。 它继续接收点击事件,它的外观不会像标准的Button那样改变。

还有一些类似的问题 ,但他们不帮助我。

即使有这样一个非常简单的布局:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageButton android:id="@+id/btn_call" android:layout_height="wrap_content" android:layout_width="wrap_content" android:clickable="false" android:enabled="false" android:src="@android:drawable/sym_action_call" /> </LinearLayout> 

该button仍处于启用状态,我可以点击它。

奇怪的是,如果我将ImageButton更改为一个简单的Button ,那么它按预期工作。 该button被禁用并且不可点击。 我不明白。 有没有人有一个想法?

Related of "禁用ImageButton"

ImageButton具有不同的inheritance链,这意味着它不会扩展Button

ImageButton < ImageView < View

它继续收到点击事件

以下是为View设置点击侦听器时发生的情况:

 public void setOnClickListener(OnClickListener l) { if (!isClickable()) { setClickable(true); } mOnClickListener = l; } 

所以如果你设置一个监听器, android:clickable="false"改变为android:clickable="true"

它的外观不会像标准的Button那样改变

您应该向视图提供一个可绘制的状态列表,以便可以基于android:enabled设置合适的图像。 你有这个吗? 或者你有唯一的图像为您的button?

编辑:你可以在这里find关于StateListDrawable的信息 。 android:state_enabled是你需要在列表中使用,以告诉操作系统什么形象使用该状态。

编辑2:因为你真的需要添加一个监听器,你可以做一个检查里面的监听器, if (!isEnabled()) { return; } else { /* process the event */ } if (!isEnabled()) { return; } else { /* process the event */ }

这里是我用来禁用ImageButton的代码,并使其看起来变灰:

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

只需调用setImageButtonEnabled() ; 唯一的缺点是你需要在这里的图像的资源ID,因为它是不可能恢复到原来的转换图标。

确保视图层次结构中没有具有相同ID的视图,并且不要将任何点击侦听器添加到该视图。

如果要禁用图像button,请在单击事件中将属性“setEnabled”设置为false

例如: imgButton.setEnabled(false);