This looks easy, but I'm not able to disable an ImageButton
. It continues to receive click events, and its appearance don't change like a standard Button would.
There are some similar questions on SO, but they don't help me.
Even with a very simple layout like this :
<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>
The button is still enabled and I can click it.
What's strange is that if I change the ImageButton
to a simple Button
, then it works as expected. The button becomes disabled and unclickable. I don't understand. Does anyone have an idea?
As other answers have said, you cannot disable an
ImageButton
in the layout XML as you can aButton
, but you can disable both the same way at runtime:In Java:
In both cases the button is disabled -- no click events get to its
onClickListener
.You can also change the icon color of the disabled
ImageButton
the same way you change the text color on a disabledButton
, assuming the icon is tintable.In the layout XML:
Now
setEnable(boolean)
on theButton
orImageButton
changes the text or icon color according to the states in yourbutton_color_selector.xml
Taking advantage of the Oleg Vaskevich's answer. Can be made an answer for Kotlin.
Make a Extension Function for ImageButton, this way:
And you get a little less reliant on providing Context
Here's the code I use to disable an
ImageButton
and make it look grayed out:Simply call
setImageButtonEnabled()
; the only downside is you need the image's resource ID in here because it's not possible to revert a transformed icon back into the original.ImageButton
has different inheritance chain meaning it does not extendButton
:ImageButton
<ImageView
<View
Here is what happens when you set a click listener for the
View
:So if you set a listener the
android:clickable="false"
changes toandroid:clickable="true"
.You should supply a drawable state list to the view so it could set an appropriate image based on
android:enabled
. Do you have this? Or you have the only image for your button?EDIT: You can find info on StateListDrawable here.
android:state_enabled
is what you need to use in the list in order to tell the OS what image to use for that state.EDIT2: Since you really need to add a listener you can make a check inside of the listener
if (!isEnabled()) { return; } else { /* process the event */ }
.Make sure there is no view with same id in your view hierarchy and you do not add any click listener to that view.
I managed to build a solution inspired by Oleg Vaskevich's answer, but without the need to pass drawable resource ID to setEnabled().
Here is Kotlin code, inside of utility module:
It can be used like this: