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

m0s*_*it0 5 android aspectj listener

我正在使用AspectJ与Android,我成功捕获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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Yal*_* T. 1

你将无法那样做。

如果我理解正确的话,您会监听视图上的 setOnClickListener() 调用。

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

唯一的解决方案是手动检查您的所有视图 - 这不推荐,也可能不是您想要的。

  • 奇怪...根据[`View`]的源代码(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view /View.java/#3565),解析 xml 属性时调用 `setOnClickListener`。它在构造函数内部被调用。 (2认同)