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?
- Cómo deshabilitar OnClickListerners
- Oyente onclick en android
- Cuál es el mejor rendimiento Wise: setOnClickListener VS android: onclick = "onClick"
- Java Android - setOnClickListener (View.OnClickListener) en el tipo View no es aplicable para los argumentos (nuevo OnClickListener () {})
- Creación de OnClickListener personalizado
Edit: cometió un pequeño error en mi código.
- Clase común para el oyente de clics
- OnClickListener Mantener pulsado el botón?
- El mejor lugar para adjuntar onClickListener en recyclerview
- Cómo pasar los parámetros a OnClickListener?
- Android: cómo manejar el botón de clic
- Múltiples botones `OnClickListener ()` android
- Declarando que una clase implementa OnClickListener vs. declarándolo usted mismo?
- Android - mismo OnClickListener para TextView y ImageView
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 🙂
🙂
- Diseño de materiales Tipografía – Titulares, Títulos, Espaciado, Aspecto de texto
- Android Source Repo GPG clave pública no encontrada