关于Library里面的R文件

Library中的R文件

前段时间跟项目老大提了个请求,就是将Butterknife加入到我们的项目中,结合android-butterknife-zelezny使用,这样子不仅代码简洁,也可以减少一些findViewById的繁琐过程,提升我们的开发效率.效果如下图,是不是特别清爽,快捷.

MacDown Screenshot
MacDown Screenshot

经过老大的同意以后,我开始加依赖,下载自动注解插件,进行自动生成代码,一气呵成,神清气爽.But问题立马就暴露出来了,代码如下:

      @OnClick({R2.id.m_button_pattern, R2.id.m_button_password})
       public void onClick(View view) {
        Log.d("xx", "========onClick=========");
        Intent intent = new Intent();
        switch (view.getId()) {
            case R2.id.m_button_pattern:
                intent.setClass(getApplicationContext(),MainActivity.class);
                Log.d("xx", "========onClick====MainActivity=====");
                break;
            case R2.id.m_button_password:
                intent.setClass(getApplicationContext(),SetPasswordLockActivity.class);
                Log.d("xx", "========onClick=====SetPasswordLockActivity====");
                break;
        }
        this.startActivity(intent);
    }

然后问题就出现了.由于我们的项目是在Library中开发(蛋疼得不行,很多限制),问题就是出在这里,请看下面的代码:

        //Library中生成的R文件
        public static int activity_open_exit=0x7f04000d;
        //Module中生成的R文件
        public static final int abc_fade_out=0x7f050001;

所以在Library中无法使用switch语句进而影响到了Butterknife的使用.

至于为什么在Library中无法使用参考谷歌文档.经过阅读我们知道从ADT14开始Library中的R文件才从静态常量变为非常量.因为如果在多个Library中可能出现id冲突的问题.在ADT14以前则采用的是将所有的资源文件和相关的代码重新随着主项目一起编译,导致编译速度过慢.因此,从ADT14开始就变成了非常量的id了:

        int id = view.getId();
        switch (id) {
            case R.id.button1:
                action1();
                break;
            case R.id.button2:
                action2();
                break;
            case R.id.button3:
                action3();
                break;
        }

Android Studio也提供了一键转换的快捷方式如下图:

ConvertSwitch
ConvertSwitch

然后就变成了如下所示的代码了.

        int id = view.getId();
        if (id == R.id.button1) {
            action1();
        } else if (id == R.id.button2) {
            action2();
        } else if (id == R.id.button3) {
            action3();
        }

因为找资料的原因又去看了下Github的Butterknife, JakeWharton大神终于在大家的强烈请求下更新了支持Library, 更新日志;

    Version 8.2.0 (2016-07-10)
    
    New: Support for library projects. Requires application of a Butter Knife Gradle plugin. See README for details.
    New: Generated code now emits R references instead of raw integer IDs.
    Fix: @OnPageChange listener binding now uses the 'add'/'remove' methods on ViewPager instead of 'set'.

算是意料之外的惊喜吧,下周一就把Butterknife加入我们的项目!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,838评论 25 709
  • Jake Wharton 是 Android 大神,同时也是开源狂魔。他开源的项目特点是小而美,且应用广泛,比如 ...
    geniusmart阅读 12,189评论 3 79
  • 墓地一直很安静。 守墓的,是个老头。灰白的头发,满脸的皱纹,黑麻麻的皮肤。手像扇子一样大,每个指头粗得好像弯不过来...
    陈大仙儿_英姐阅读 730评论 3 8
  • 随风扬起的长发 帆布双肩背包 你依旧 那个蹦蹦跳跳的小女孩 做着做不完的梦
    S_Cat臭臭猫阅读 283评论 2 2