Remove an onclick listener

AndroidOnclickTextviewListener

Android Problem Overview


I have an object where the text cycles and displays status messages. When the messages change, I want the click event of the object to change to take you to the activity that the message is relating to.

So, I have a TextView mTitleView and I'm assigning the event like this.

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

How do I remove that click event? There are some status messages that do not have an actionable area so I'd like to turn off the click event. I'd also like to be able to cycle through these click events and dispose of them properly, but I'm unsure of the best practice.

Android Solutions


Solution 1 - Android

mTitleView.setOnClickListener(null) should do the trick.

A better design might be to do a check of the status in the OnClickListener and then determine whether or not the click should do something vs adding and clearing click listeners.

Solution 2 - Android

Note that if a view is non-clickable (a TextView for example), setting setOnClickListener(null) will mean the view is clickable. Use mMyView.setClickable(false) if you don't want your view to be clickable. For example, if you use a xml drawable for the background, which shows different colours for different states, if your view is still clickable, users can click on it and the different background colour will show, which may look weird.

Solution 3 - Android

Perhaps setOnClickListener(null) ?

Solution 4 - Android

Setting setOnClickListener(null) is a good idea to remove click listener at runtime.

And also someone commented that calling View.hasOnClickListeners() after this will return true, NO my friend.

Here is the implementation of hasOnClickListeners() taken from android.view.View class

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

Thank GOD. It checks for null.

So everything is safe. Enjoy :-)

Solution 5 - Android

The above answers seem flighty and unreliable. I tried doing this with an ImageView in a simple Relative Layout and it did not disable the onClick event.

What did work for me was using setEnabled.

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

You can then check whether the View is enabled with:

boolean ImageView.isEnabled();

Another option is to use setContentDescription(String string) and String getContentDescription() to determine the status of a view.

Solution 6 - Android

Just put,it has worked for me

itemView.setOnClickListener(null);

Solution 7 - Android

You could add the following extension function:

fun View.removeClickListener() {
  setOnClickListener(null)
  isClickable = false
}

And then on your callers you'd do:

val textView = findViewById(R.id.activity_text)
textView.removeClickListener()

Solution 8 - Android

    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);
                
            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);
               
            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Solution 9 - Android

Just reinitializing item as below would do the trick. It would remove onclick,onlonglick,onitemclick,onitemlongclick based on item

mTitleView = findViewById(R.id.mTitleView);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoshView Question on Stackoverflow
Solution 1 - AndroidRobby PondView Answer on Stackoverflow
Solution 2 - AndroidFreewheelNatView Answer on Stackoverflow
Solution 3 - AndroidLutherView Answer on Stackoverflow
Solution 4 - AndroidAzim AnsariView Answer on Stackoverflow
Solution 5 - AndroidBrandon ThompsonView Answer on Stackoverflow
Solution 6 - Androidsaigopi.meView Answer on Stackoverflow
Solution 7 - AndroidEvin1_View Answer on Stackoverflow
Solution 8 - AndroidandroidmalinView Answer on Stackoverflow
Solution 9 - AndroidRockit RockitView Answer on Stackoverflow