Necesito un getOnClickListener() para Vistas en Android. De esta forma, se puede asignar un temporal OnClickListener a mis puntos de vista.
Quiero usarlo como este:

private View.OnClickListener oldListener;

public void assignTempListener(View view) {
    oldListener = view.getOnClickListener(); //doesn't exist

    view.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //some code

            v.setOnClickListener(oldListener);
        }
    });
}

El problema es que esta función doen no existe. Yo también no se puede heredar de Vista para crear este método, debido a que todo tipo de Opiniones se puede pasar a assignTempListener. Hay otra forma de usar esto?

Edit: hecho un pequeño error en mi código.

Quiero asignar un temporal OnClickListener para ya salir de la Vista. No tengo control, donde el original OnClickListener es asignado. Así que no se puede almacenar.

OriginalEl autor user969039 | 2012-06-25

5 Comentarios

  1. 25

    Usted puede hacer esto con…REFLEXIÓN. *redoble de tambor*

    Esta ruta está llena de peligros.

    No lo recomiendo, ya que la estructura interna de la clase puede cambiar en cualquier momento, pero aquí es cómo usted puede hacerlo en la actualidad Android 4.2.2 si es realmente inevitable:

    /**
    * Returns the current View.OnClickListener for the given View
    * @param view the View whose click listener to retrieve
    * @return the View.OnClickListener attached to the view; null if it could not be retrieved
    */
    public View.OnClickListener getOnClickListener(View view) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    return getOnClickListenerV14(view);
    } else {
    return getOnClickListenerV(view);
    }
    }
    //Used for APIs lower than ICS (API 14)
    private View.OnClickListener getOnClickListenerV(View view) {
    View.OnClickListener retrievedListener = null;
    String viewStr = "android.view.View";
    Field field;
    try {
    field = Class.forName(viewStr).getDeclaredField("mOnClickListener");
    retrievedListener = (View.OnClickListener) field.get(view);
    } catch (NoSuchFieldException ex) {
    Log.e("Reflection", "No Such Field.");
    } catch (IllegalAccessException ex) {
    Log.e("Reflection", "Illegal Access.");
    } catch (ClassNotFoundException ex) {
    Log.e("Reflection", "Class Not Found.");
    }
    return retrievedListener;
    }
    //Used for new ListenerInfo class structure used beginning with API 14 (ICS)
    private View.OnClickListener getOnClickListenerV14(View view) {
    View.OnClickListener retrievedListener = null;
    String viewStr = "android.view.View";
    String lInfoStr = "android.view.View$ListenerInfo";
    try {
    Field listenerField = Class.forName(viewStr).getDeclaredField("mListenerInfo");
    Object listenerInfo = null;
    if (listenerField != null) {
    listenerField.setAccessible(true);
    listenerInfo = listenerField.get(view);
    }
    Field clickListenerField = Class.forName(lInfoStr).getDeclaredField("mOnClickListener");
    if (clickListenerField != null && listenerInfo != null) {
    retrievedListener = (View.OnClickListener) clickListenerField.get(listenerInfo);
    }
    } catch (NoSuchFieldException ex) {
    Log.e("Reflection", "No Such Field.");
    } catch (IllegalAccessException ex) {
    Log.e("Reflection", "Illegal Access.");
    } catch (ClassNotFoundException ex) {
    Log.e("Reflection", "Class Not Found.");
    }
    return retrievedListener;
    }
    Trabajó como un encanto.
    nada funciona ahora, androidx de usuario aquí

    OriginalEl autor kcoppock

  2. 4

    puede invalidar la clase y declarar un onClicklistener para la vista y escribir setter y getter para onClickListener campo:

    public class SAutoBgButton extends ImageButton {
    public View.OnClickListener mOnClickListener;
    @Override
    public void setOnClickListener(OnClickListener l) {
    super.setOnClickListener(l);
    mOnClickListener = l;
    }
    public OnClickListener getmOnClickListener() {
    return mOnClickListener;
    }
    }

    OriginalEl autor saleh sereshki

  3. 1

    uso

     oldListener = new view.OnClickListener() {
    @Override
    public void onClick(View v) {
    //some code
    v.setOnClickListener(oldListener);
    }
    });

    lugar de

    oldListener = view.getOnClickListener(); //doesn't exist

    getOnClickListener no es cualquier método para Ver o para Botón en la API Actual a ver docs para más detalles

    http://developer.android.com/reference/android/view/View.OnClickListener.html

    He cometido un error: oldListener = view.setOnClickListener(); // doesn't exist tuvo que ser oldListener = view.getOnClickListener(); // doesn't exist
    véase mi edición de respuesta.gracias

    OriginalEl autor ρяσѕρєя K

  4. 1

    Respuesta puede ser tan fácil

    OnClickListener ocl = new OnClickListener { 
    @Override
    public void onClick(View view) {
    clickableView.performClick();
    }
    }

    La funcionalidad completa de onclicklistener, excepto una cosa – no se puede pasar a cualquier vista como argumento en ella, clickableView será el controlador, pero en la mayoría de los casos es suficiente

    OriginalEl autor iamthevoid

  5. 0

    Niet!

    La oldListener en las respuestas dadas en cada caso ser redefinido, y es viejo estado o definición se pierde, independientemente de su nombre pretender otra cosa.

    Siguiente esta técnica:
    Conseguir actual onClickListener de un Android objeto de la Vista
    el ‘viejo’ escucha estarían en el resumen de la clase del método onClick
    y temporal de escucha usaría setOnClickListener junto con una llamada a super con el fin de (re)establecer la antigua escucha cuando o, según el caso

    La temp escucha de la configuración de código no necesita saber lo que el ‘viejo’ oyente es, sin embargo,
    aún existe la necesidad de que haber alguna forma de coordinación para que el autor de aquel o aquellos a los oyentes a hacer ellos abstracto y utilizar el método onClick para el oyente haga clic en, en definitiva, a seguir un protocolo.

    Excepcionalmente es posible que desee pasar el protegido o privado calificador de la onclicklistener Vista miembro: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.0mOnClickListener
    y, a continuación, hacer un poco de http://www.jguru.com/faq/view.jsp?EID=321191
    que se obtiene al oyente.

    Incluso es posible que desee escribir su propia getOnClickListener, o cualquier getter para que la materia, que utiliza la instrospección enfoque, si por supuesto, lo que realmente funciona 🙂

    🙂

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here