捕获通过XML定义的View.setOnClickListener()

时间:2012-09-12 15:27:13

标签: android listener aspectj

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

不幸的是,这并没有捕获布局XML中使用android:onClick设置的侦听器。有没有办法捕获这个?

3 个答案:

答案 0 :(得分:1)

你不能那样做。

如果我正确理解你在视图上听取setOnClickListener()的调用。

在xml中设置onclick属性时,从不调用它。在创建视图时直接设置监听器。永远不会调用setOnClickListener()。

唯一的解决方案是手动检查所有观看次数 - 这是不推荐的,也可能不是你想要的。

答案 1 :(得分:1)

我不是100%确定这是否可行,但为什么不修改View类以获得mOnClickListener属性。然后,当要在自定义View类中设置OnClickListener时,将该属性设置为“new OnClickListener(){...}”,然后使用该属性调用setOnClickListener。然后,您将添加一个名为getOnClickListener()的公共方法,您可以在自定义View对象上调用该方法以返回所述侦听器。

这可能是一种迂回/繁琐的方式,因为您还需要不仅包括自定义View类,而且还要包括您计划在XML中使用的View的每个子类,并更改其超类以使用自定义View,而不是Android的。然后,您需要更改XML元素以反映它,即com.yourpackage.Button等。

答案 2 :(得分:-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 
}