Подтвердить что ты не робот

GetOnClickListener() в представлениях Android

Мне нужен getOnClickListener() для Views в Android. Таким образом, я могу назначить временный OnClickListener своим представлениям. Я хочу использовать его следующим образом:

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

Проблема заключается в том, что эта функция не существует. Я также не могу наследовать от View для создания этого метода, потому что все виды Views могут быть переданы назначениюTempListener. Есть ли другой способ использовать это?

Изменить: сделал небольшую ошибку в моем коде.

4b9b3361

Ответ 1

Вы можете сделать это с помощью... REFLECTION. * барабан рулон *

Этот маршрут чреват опасностью.

Я не рекомендую это, так как внутренняя структура класса может измениться в любой момент, но вот как вы можете сделать это в настоящее время до Android 4.2.2, если это действительно неизбежно:

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

Ответ 2

вы можете переопределить класс и объявить onClicklistener для своего представления и написать setter и getter для поля 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;
  }
}

Ответ 3

использование

 oldListener = new view.OnClickListener() {

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

          v.setOnClickListener(oldListener);
        }
    });

вместо

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

getOnClickListener не является методом View или для Кнопка в Current API см. документы для более подробной информации

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

Ответ 4

Niet!

oldListener в приведенных ответах в каждом случае переопределяется, и старое состояние или определение теряются независимо от того, что это имя притворяется иначе.

Следуя этой методике: Получить текущий onClickListener объекта Android View "старый" слушатель будет установлен в методе абстрактного класса onClick и любой временный слушатель будет использовать setOnClickListener вместе с вызовом super, чтобы (re) установить старый прослушиватель, когда или когда это необходимо

Код настройки тембра слушателя не должен знать, что такое "старый" слушатель для того, чтобы автор этого или тех слушателей мог сделать их абстрактными и по-прежнему использовать метод onClick, необходимо установить некоторую форму координации, чтобы, вкратце, следить за протоколом.

В исключительном случае вы можете обойти защищенный или закрытый квалификатор onclicklistener. Просмотр элемента: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.0mOnClickListener а затем сделайте немного http://www.jguru.com/faq/view.jsp?EID=321191 который доставит вам слушателя.

Возможно, вы даже захотите написать свой собственный getOnClickListener или любой получатель, который использует метод instrospection, если, конечно, он действительно работает:)

:)