morristech
5/1/2018 - 11:06 AM

injecting click event to a view in android

injecting click event to a view in android


  public static void injectClickEvent(MainMenuParentViewHolder viewHolder, final View.OnClickListener listener) {
      try {
          final View.OnClickListener clickListener = (View.OnClickListener) viewHolder.itemView.getTag();
          if (clickListener == null) {
              viewHolder.itemView.setTag(getClickListener(viewHolder.itemView));
          }
          viewHolder.itemView.setOnClickListener(listener);
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      } catch (NoSuchFieldException e) {
          e.printStackTrace();
      } catch (IllegalAccessException e) {
          e.printStackTrace();
      }
  }
  
  public static View.OnClickListener getClickListener(View view) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
      // get the nested class `android.view.View$ListenerInfo`
      Field listenerInfoField = null;
      listenerInfoField = Class.forName("android.view.View").getDeclaredField("mListenerInfo");
      if (listenerInfoField != null) {
          listenerInfoField.setAccessible(true);
      }
      Object myLiObject = null;
      myLiObject = listenerInfoField.get(view);

      // get the field mOnClickListener, that holds the listener and cast it to a listener
      Field listenerField = null;
      listenerField = Class.forName("android.view.View$ListenerInfo").getDeclaredField("mOnClickListener");
      if (listenerField != null && myLiObject != null) {
          View.OnClickListener myListener = (View.OnClickListener) listenerField.get(myLiObject);
          return myListener;
      }
      return null;
  }