1

我们在 Android 中有设置按钮的 OnClickListener 的方法(button.setOnClickListener(....),但没有 .getOnClickListener。

我需要将侦听器分配给 Button 并将其保存在变量中。

OnClickListener是Button类的protected字段,继承自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我知道其他方法可以让我的应用程序在没有反射的情况下工作,只是想知道为什么它不起作用。

4

3 回答 3

2

您正在课堂上调用该方法getClass。相反,您应该调用类getClass的对象Button,或使用类字段:

Button.class.getSuperClass().getSuperClass().getDeclaredField("mOnClickListener"):

另一种方法:

Button.class.getField("mOnClickListener");

getField 方法包括从超类继承的字段。

于 2013-01-30T13:25:34.907 回答
1

您想让该字段可访问。

所以你基本上会得到类似的东西

Field f = obj.getClass().getDeclaredField("mOnClickListener");
f.setAccessible(true);
于 2013-01-30T13:28:31.110 回答
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();
}
于 2013-01-30T13:32:47.143 回答