Получить объект OnTouchListener из представления по отражению - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужно изменить действие onTouch в том же представлении. Поэтому мне нужно в поле mOnTouchListener, которое хранится в static class ListenerInfo в public class View Я пытаюсь это:

Field onTouchListenerField = myView.getClass().getDeclaredField("ListenerInfo.mOnTouchListener");

, и я получаю ошибку: No field ListenerInfo.mOnTouchListener in class MyView; (declaration of 'MyView' appears in ...)

Почему в этом коде они нашли поля только в MyView классе, а не в базе View?

У вас есть идеи?

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете получить это поле от View.class. но другая ошибка в вашем коде - вы устали получать поле ListenerInfo.mOnTouchListener, но это не поле. сначала вы должны получить mListenerInfo поле из View.class, а затем mOnTouchListener из этого.

Попробуйте это, отлично работает.

View.OnTouchListener mOnTouchListener = null;

try {
    Field mListenerInfoField = View.class.getDeclaredField("mListenerInfo");
    mListenerInfoField.setAccessible(true);
    Object mListenerInfo = mListenerInfoField.get(myView);
    Field mOnTouchListenerField = mListenerInfo.getClass().getDeclaredField("mOnTouchListener");
    mOnTouchListenerField.setAccessible(true);
    mOnTouchListener = (View.OnTouchListener) mOnTouchListenerField.get(mListenerInfo);
    mOnTouchListenerField.setAccessible(false);
    mListenerInfoField.setAccessible(false);
} catch (Exception e) {
    e.printStackTrace();
}

if (mOnTouchListener != null) {
    mOnTouchListener.onTouch(myView, null);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...