GetOnClickListener () en las vistas de Android

Necesito un getOnClickListener () para vistas en Android. De esta manera puedo asignar un OnClickListener temporal a mis vistas. Quiero usarlo así:

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 no existe. También no puedo heredar de vista para crear este método, porque todo el tipo de vistas se puede pasar a assignTempListener. ¿Hay otra manera de usar esto?

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

Usted puede hacer esto con … REFLEXIÓN . Rollo 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 se puede hacer en la actualidad hasta 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; } 

Puede anular la clase y declarar un onClicklistener para su vista y escribir setter y getter para el campo onClickListener:

 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; } } 

utilizar

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

en lugar de

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

GetOnClickListener no es ningún método para ver o para el botón en la API actual vea docs para más detalles

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

¡Niet!

El oldListener en las respuestas dadas es en cada caso que se redefine y es viejo estado o la definición se pierde sin importar su nombre que finge de otra manera.

Siguiendo esta técnica: Get current onClickListener de un objeto Android View el oyente 'antiguo' se establecería en el método onClick de la clase abstracta y cualquier oyente temporal usaría setOnClickListener junto con una llamada a super para (re) establecer el oyente antiguo cuando O según corresponda

El código de configuración del oyente temporal no necesita saber lo que el oyente "viejo" es sin embargo, todavía necesita ser alguna forma de coordinación para que el autor de ese o esos oyentes hacerlos abstractos y utilizar el método onClick para establecer el oyente de clic , En definitiva, seguir un protocolo.

Excepcionalmente puede que desee omitir el calificador protegido o privado del miembro onclicklistener View: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/ View / View.java # View.0mOnClickListener y luego hacer un poco http://www.jguru.com/faq/view.jsp?EID=321191 que obtendrá el oyente.

Es posible que incluso quieren escribir su propio getOnClickListener, o cualquier getter para el caso, que utiliza el enfoque de instrospección, si por supuesto realmente funciona 🙂

🙂

  • ¿Cómo se utiliza un OnClickListener en una vista de reciclador?
  • Añada dinámicamente funcionalidad a la función onclicklistener de Button en Android
  • onClickListener a un botón del teclado
  • Múltiples botones `OnClickListener ()` android
  • Interfaces de Android y onCreate ()
  • Android - OnClick Listener en una clase aparte
  • Haga doble clic en OnClickListener de un adaptador de vista de reciclador
  • RecyclerView onClick
  • ¿Cómo puedo activar el evento OnClick mediante programación en android?
  • Haga clic en Android a través de PopupWindow
  • Cómo manejar múltiples clics de diseño en recyclerView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.