1

ボタンの OnClickListener を設定するための Android のメソッド (button.setOnClickListener(....) がありますが、.getOnClickListener はありません。

ボタンに割り当てられたリスナーを取得し、変数に保存する必要があります。

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私は自分のアプリをリフレクションなしで機能させる他の方法を知っています.なぜそれが機能しないのか疑問に思っています.

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 に答える