我想知道一些项目(Buttons,EditText等)是否有Touch Listeners - 只有在没有这样的情况下我才想要添加自己的Listeners(我从另一个类中获取项目)。 有没有办法检测到它?
答案 0 :(得分:1)
您可以获取名为View
mOnTouchListener
私人字段
以下是您使用反射的方式:Access to private inherited fields via reflection in Java
答案 1 :(得分:1)
感谢Niko,我能够做我想做的事。 在api> = 15时,我使用反射(使用Niko示例)来获取字段:mListenerInfo,然后我再次使用反射来获取字段mOnTouchListener。现在,如果它为null,则表示没有触摸侦听器,否则它具有。 这是一个代码示例(没有try catch):
Field field_mListenerInfo = null;
Object originalListener = null;
Object myListenerInfo = null;
Field field_mOnTouchListener = null;
View viewForField = new View(activity); //needed just to get field name
field_mListenerInfo = viewForField.getClass().getDeclaredField("mListenerInfo");
field_mListenerInfo.setAccessible(true);
originalListener = field_mOnTouchListener.get(myListenerInfo );
myListenerInfo = field_mListenerInfo.get(view);
field_mOnTouchListener = myListenerInfo.getClass().getDeclaredField("mOnTouchListener");
field_mOnTouchListener.setAccessible(true);
现在如果originalListener为null,则意味着没有touchListner。否则,您实际上可以使用此侦听器 - 例如,连接几个侦听器。 如果根本没有监听器,那么mListenerInfo将为null。 当然,您应该使用try catch打包此代码,否则如果您的任何字段为空,它将会中断。
答案 2 :(得分:0)
就个人而言,我认为检查文档是您最好的选择。
答案 3 :(得分:0)
在我自己寻找这个问题的解决方案一段时间后,我找到了一个有效的解决方案。 我希望附加的代码有帮助:
private static View.OnTouchListener getOnTouchListener(View view) {
View.OnTouchListener 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("mOnTouchListener");
if (clickListenerField != null && listenerInfo != null) {
clickListenerField.setAccessible(true);
retrievedListener = (View.OnTouchListener) clickListenerField.get(listenerInfo);
}
} catch (NoSuchFieldException ex) {
Timber.e("getOnTouchListener() No Such Field. %s",ex.getMessage());
} catch (IllegalAccessException ex) {
Timber.e("getOnTouchListener() Illegal Access. %s",ex.getMessage());
} catch (ClassNotFoundException ex) {
Timber.e("getOnTouchListener() Class Not Found. %s",ex.getMessage());
}
return retrievedListener;
}