我们在Android中有方法为Button设置OnClickListener(button.setOnClickListener(....),但没有.getOnClickListener。
我需要将侦听器分配给Button并将其保存在变量中。
OnClickListener是Button类的受保护字段,继承自TextView,继承自View类。字段“mOnClickListener”的名称。我甚至无法通过反思得到它:
...
Button button1 = (Button) findViewById(R.id.button1);
OnClickListener listener = getListener(button1);
...
public OnClickListener getListener(Button b) {
java.lang.reflect.Field field = b.getClass().getSuperclass().getSuperclass().getDeclaredField("mOnClickListener");
...
}
获得“noSuchFieldException”。有什么想法可以实现吗?
PS我知道其他方法可以使我的应用无需反思,只是想知道为什么它不起作用。
答案 0 :(得分:2)
您正在课堂上调用方法getClass
。相反,您应该在getClass
类的对象上调用Button
,或使用类字段:
Button.class.getSuperClass().getSuperClass().getDeclaredField("mOnClickListener"):
另一种方法:
Button.class.getField("mOnClickListener");
方法getField包含从超类继承的字段。
答案 1 :(得分:1)
你想让田野可以进入。
所以你基本上会找到像
这样的东西Field f = obj.getClass().getDeclaredField("mOnClickListener");
f.setAccessible(true);
答案 2 :(得分:1)
您收到此错误是因为您不是从按钮开始。而是这样做:
java.lang.reflect.Field field = View.class.getField("mOnClickListener");
当你有字段使其可访问时:
try{
field.setAccessible(true);
Object clickListener = field.get(b);
field.setAccessible(false);
}catch(Exception e){
e.printStacktrace();
}