代码之家  ›  专栏  ›  技术社区  ›  m0skit0

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

  •  5
  • m0skit0  · 技术社区  · 12 年前

    我在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中。有什么方法可以捕捉到这一点吗?

    3 回复  |  直到 12 年前
        1
  •  1
  •   Yalla T.    12 年前

    那样你做不到。

    如果我理解正确的话,那就是你在视图上监听setOnClickListener()的调用。

    当您在xml中设置onclick属性时,它从未被调用。侦听器是在直接创建视图时设置的。永远不会调用setOnClickListener()。

    唯一的解决方案是手工检查你的所有观点——这是不推荐的,也可能不是你想要的。

        2
  •  1
  •   dennisdrew    12 年前

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

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

        3
  •  -5
  •   m0skit0    12 年前

    您可以使用,

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