2012-09-12 11 views
5

によって定義された私は、AndroidとAspectJのを使用していると私は正常にこの側面でView.setOnClickListener()への呼び出しをキャプチャしています:キャプチャView.setOnClickListener()XML

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()); 
    } 
} 

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

答えて

1

あなたは文句を言わないそのようにすることを行うことができます。

私はそれを正しく理解している場合、ビューのsetOnClickListener()の呼び出しを受け取ります。

xmlにonclick属性を設定すると、その属性は決して呼び出されません。リスナーは、ビューが作成されたときに直接設定されます。 setOnClickListener()は決して呼び出されません。

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

+0

プログラムですべてのビューをチェックしても構いませんが、どのようにリスナーをチェックするのですか? 'getOnClickListener()'はありませんが( 'getOnFocusChangeListener()' ...:P) – m0skit0

+1

ああ。私はなぜそれが不思議です。私の悪い、私はあると思った。申し訳ありませんが、あなたを助けることはできません。私はaspectjに慣れていない、私はちょうどonclicklistenerはビューのコンストラクタ(レイアウトを膨張させるとき)でXMLを解析するときに直接設定されることを伝えることができます。あなたはxmlを自分で解析することができますが、呼び出されたメソッド名は少なくとも取得されますが、リスナーオブジェクトはありません。それはおそらく仕事の大部分です。 –

+0

はい私はXMLの解析について考えました。あなたの答えをありがとう:) – m0skit0

-5

あなたが使用することができ、あなたの活動の内部API次

<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" > 

追加、

public void textclick(View v){ 

//TODO :anything you want 
} 
+1

ここで私が求めていることとは関係ありません。 – m0skit0

1

これがうまくいくかどうかは確かではありませんが、Viewクラスを変更してmOnClickListener属性を持たないのはなぜですか。次に、OnClickListenerがカスタムViewクラスで設定される直前に、属性を "new OnClickListener(){...}"に設定して、その属性でsetOnClickListenerを呼び出します。次に、getOnClickListener()というパブリック・メソッドを追加します。このメソッドは、カスタム・ビュー・オブジェクトでコールして、リスナーを戻すことができます。

これは、カスタムViewクラスだけでなく、XMLで使用する予定のViewのすべてのサブクラスとカスタムビューを使用するようにスーパークラスを変更する必要があるため、ラウンドアバウト/ Androidのものではありません。次に、XML要素(com.yourpackage.Buttonなど)を変更する必要があります。

+1

私はこれも考えましたが、すべてのViewの子をサブクラス化したり、サードパーティの開発者にこのクラスを使用させたりするにはあまりにも多くの作業が必要でした...私がこれから得ているメリットは、とにかくあなたの答えをありがとう:) – m0skit0