jarryleo/SingleClick

多个模块使用的时候

Closed this issue · 19 comments

R2和R文件不相等,会导致判断无效

R2文件是什么情况下才出现的呢?我还没遇到过R2文件

Android组件化开发的时候。在library的模块,因为要求R为常量,所以出现了R2的。butterKnife的使用中有这种情况。注解里面必须包含的是常量,只能用R2.id.xxx

我这里判断相同控件是用的 view.getId() 方法,跟R文件没关系吧 ,难道说 butterk注解的点击事件的id 跟 view.getId() 的id 不一致吗? 也不对啊,我始终是用的 view.getId() 拿到的控件id 跟butterKnife无关啊;
大概相关的只有我的注解里面的排除id except; 麻烦您能详细解释一下吗?

您源码里面不是从注解拿的v的id值么,这里拿到的是R2的值。实际上View.getId()是R的值。所以会不相等。https://blog.csdn.net/zyw0101/article/details/80399225,这里blogs里面有出现R2

我的源码并没有从注解里面拿id值;判断控件否相同,一直是用的view.getId(); 所以跟ButterKnife的注解无关,唯一用到注解里面的id的源码是 SingleClick 注解的 except 参数,用来排除防双击的id ;
所以我想您第一个问题的失效应该不是R2文件导致;

SingleClick annotation = method.getAnnotation(SingleClick.class);

            int[] except = annotation.except();
            for (int i : except) {
                if (i == id) {
                    joinPoint.proceed();
                    return;
                }
            }

这里拿到的except的值是R2.而那个i还是之前的view.getId().在组件化的情况下,这个判断会失效。

这个判断是排除指定id的控件不防止重复点击,您可以设置参数为R,而不是R2,因为这个注解是本框架用的,对butterKnife没有影响.

设置不了R的,这里要求必须为常量。R文件中没有final。只能写R2在注解中

我所知到的系统的R文件值都是常量,难道模块里面的R不是常量吗?如果不是的话,那么请教如何把R和R2的值对应起来?

多模块情况下,没有在点击事件添加@singleclick注解,无法防止快速点击,使用except关键字时,只能使用R2.id.btn,不能使用R.id.btn,导致获取值不同,except失效。

多模块情况下,没有在点击事件添加@singleclick注解,无法防止快速点击,使用except关键字时,只能使用R2.id.btn,不能使用R.id.btn,导致获取值不同,except失效。

多模块情况下,没有在点击事件添加@singleclick注解

这个问题我大概想到原因了.每个模块的build 都要添加插件 apply plugin: 'cn.leo.plugin.magic' ;
R2 文件的问题,我上面讨论了这么多,我还不知道怎么解决

我有在每个模块都添加了插件的,所以使用注解才生效,但是不使用注解是失效的,而且RecyclerView的Adapter的Item监听也是无效的,可能需要写在类中添加注解才生效。

等我有空测试一下

这个库源码才百来行,如果您有解决方案,欢迎pull request ^_^

好的。明天我看看源码

Debug了一下,发现没有问题,可以拦截,出现问题的地方不在你的库这里。

经测试,多模块拦截没有问题,排除拦截在模块里用注解参数exceptIdName

改成直接比较R的字符串,那么现在如果用注解,就是需要多传递一个id的String么。建议你还是弄个群或者讨论组比较好

已经在README里面写了范例:
app module:
@SingleClick(value = 1000, except = {R.id.tv1, R.id.button})
other module:
@SingleClick(value = 1000, exceptIdName = {"testBtn2"})

可以加我企鹅: 373.206.074 (刚才打错一个字)