Eliminar un oyente onclick


194

Tengo un objeto donde el texto cambia y muestra mensajes de estado. Cuando los mensajes cambian, quiero que cambie el evento de clic del objeto para llevarlo a la actividad con la que se relaciona el mensaje.

Entonces, tengo un TextView mTitleViewy estoy asignando el evento de esta manera.

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

¿Cómo elimino ese evento de clic? Hay algunos mensajes de estado que no tienen un área procesable, por lo que me gustaría desactivar el evento de clic. También me gustaría poder recorrer estos eventos de clics y eliminarlos correctamente, pero no estoy seguro de la mejor práctica.

Respuestas:


416

mTitleView.setOnClickListener(null) debería hacer el truco.

Un mejor diseño podría ser hacer una verificación del estado en OnClickListener y luego determinar si el clic debería hacer algo en lugar de agregar y borrar oyentes de clics.


1
¿No hay ninguna otra limpieza que deba hacer para cancelar el registro del evento?
Josh

2
No El oyente es solo un objeto que la vista utiliza para llamar a un método cuando hace clic, por lo que cuando lo configura como nulo, lo destruye.
Robby Pond

15
Me pregunto si los oyentes causan la asignación de memoria. ¿Necesitamos liberarlos? ¿Eso aumentará el rendimiento de la aplicación?
alicanbatur el

2
Gracias por su respuesta, no dude en agregar por qué cree que es mejor verificar el estado o una marca en el oyente.
kapv89

2
Cuando dices a better design¿estás implicando implicaciones de rendimiento o simplemente estás diciendo que es un poco desagradable?
RTF

132

Tenga en cuenta que si no se puede hacer clic en una vista (por ejemplo, una vista de texto), la configuración setOnClickListener(null)significará que se puede hacer clic en la vista. Úselo mMyView.setClickable(false)si no desea que se pueda hacer clic en su vista. Por ejemplo, si usa un xml dibujable para el fondo, que muestra diferentes colores para diferentes estados, si su vista aún es clicable, los usuarios pueden hacer clic en él y se mostrará el color de fondo diferente, lo que puede parecer extraño.


Es bueno saberlo para TextView y tal, pero para ListView no tiene efecto cuando se configuró previamente OnClickListener.
Alguien en algún lugar

44
Es por eso que escribí "Tenga en cuenta que si una vista no se puede hacer clic (un TextView, por ejemplo)", se puede hacer clic en un ListView y, por lo tanto, esto no funciona.
FreewheelNat

Si necesitamos cambiar de un lado a otro para deshabilitar / habilitar la vista onClickListener, en mi opinión, esta es la mejor solución que configurar setOnClickListener (nulo).
Panini Luncher

1
view.setOnClickListener (nulo) junto con view.setClickable (false) es la respuesta correcta, ¡gracias!
Petros Mastrantonas

12

Tal vez setOnClickListener(null)?


1
Esto no funciona específicamente para casillas de verificación, y probablemente tampoco funcionará para otros widgets.
Chris

8

La configuración setOnClickListener(null)es una buena idea para eliminar el escucha de clics en tiempo de ejecución.

Y también alguien comentó que View.hasOnClickListeners()volvería a llamar después de esto true, NO , amigo mío.

Aquí está la implementación de hasOnClickListeners()tomado de la android.view.Viewclase

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

Gracias a Dios. Se comprueba para null.

Entonces todo está a salvo. Disfruta :-)


4

Las respuestas anteriores parecen fugaces y poco confiables. Intenté hacer esto con un ImageView en un diseño relativo simple y no deshabilitó el evento onClick.

Lo que funcionó para mí fue usar setEnabled.

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

Luego puede verificar si la Vista está habilitada con:

boolean ImageView.isEnabled();

Otra opción es usar setContentDescription (String string) y String getContentDescription () para determinar el estado de una vista.



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

    }
}

0

Solo reiniciar el elemento como se muestra a continuación sería suficiente. Eliminaría onclick, onlonglick, onitemclick, onitemlongclick según el elemento

mTitleView = findViewById (R.id.mTitleView);

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.