我在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
设置的侦听器。有没有办法捕获这个?
答案 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
}