5

私は Android で AspectJ を使用してView.setOnClickListener()おり、この側面での呼び出しを正常にキャプチャしています:

public aspect Test {

    pointcut callPointcut(View view, OnClickListener listener) : call(void View.setOnClickListener(OnClickListener)) && target(view) && args(listener);

    @SuppressAjWarnings // Exported advice
    before(View view, OnClickListener listener) : callPointcut(view, listener)
    {
        Log.d("AspectJ", "Attempt to set onClick listener on view " + Integer.toHexString(view.getId()));
        Log.d("AspectJ", "Aspect has executed.");
        Log.d("AspectJ", listener.toString());
    }
}

android:onClick残念ながら、これはレイアウト XML で設定されたリスナーをキャプチャしません。これをキャプチャする方法はありますか?

4

3 に答える 3

1

あなたはそのようにすることはできません。

私が正しく理解していれば、ビューでsetOnClickListener()の呼び出しを聞いています。

xmlでonclick属性を設定すると、呼び出されることはありません。リスナーは、ビューの作成時に直接設定されます。setOnClickListener()が呼び出されることはありません。

唯一の解決策は、すべてのビューを手作業でチェックすることです。これは推奨されておらず、おそらくあなたが探しているものではありません。

于 2012-09-18T13:17:44.837 に答える
1

これが機能するかどうかは 100% わかりませんが、View クラスを変更して mOnClickListener 属性を持たせてみませんか。次に、カスタム View クラスで OnClickListener を設定しようとしているときに、属性を "new OnClickListener(){ ... }" に設定し、その属性で setOnClickListener を呼び出します。次に、getOnClickListener() というパブリック メソッドを追加します。これをカスタム View オブジェクトで呼び出して、上記のリスナーを返すことができます。

カスタム View クラスだけでなく、XML で使用する予定の View のすべてのサブクラスを含め、そのスーパークラスを Android ではなくカスタム View を使用するように変更する必要があるため、これは回りくどい/面倒な方法かもしれません。次に、それを反映するように XML 要素を変更する必要があります。つまり、com.yourpackage.Button などです。

于 2012-09-21T16:51:25.263 に答える
-5

あなたが使用することができます、

 <TextView
            android:id="@+id/display_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:onClick="testclick"
            android:textSize="16sp"
            android:textStyle="bold" >

アクティビティ内に次の API を追加します。

public void textclick(View v){

//TODO :anything you want 
}
于 2012-09-17T04:55:33.780 に答える