Android Library中switch-case访问资源id失败问题 分析与解决方法

最近研究android 组件化过程中 遇到了一个问题 给一个library 中的 button 添加点击监听时 使用switch-case访问button id 飘红报错
提示是
Resource IDs cannot be used in a switch statement in Android library modules less.
Validates using resource IDs in a switch statement in Android library module. Resource IDs are non final in the library projects since SDK tools r14, means that the library code cannot treat these IDs as constants.

这段话告诉我 这个id 在library module 的 switch 语句中使用 由于sdk r14版本的问题,资源id在库项目中是非final的,这意味着库代码不能将这些id视为常量。意思也就是说 switch - case 无法引用变量作为资源id 的指向 他所需要的是常量 还有一个关键是 sdk r14的原因 下面说到

当我取消以来 library 转换成 application 时 又可以了 也就是说这种情况并不是我书写问题 而是和module 的 类型有关 接着上面分析 查看一下R库的id 看一下两者的区别
图例1 (library module 的id格式)

library

图例2 (application module 的 id 格式)

application

对比发现 library 是static 形式的int (静态变量) 而 在application中 是 static final 形式的 int(静态常量) 联想到上面的提示 就可以发现问题所在 在 library module 中 switch - case 无法引用变量作为资源id 的指向 这里是根源 再来看看 sdk r14 (android sdk 官网地址有兴趣可以了解一下 http://tools.android.com/tips/non-constant-fields

Non-constant Fields in Case Labels
In a regular Android project, constants in the resource R class are declared like this:
public static final int main=0x7f030004;

However, as of ADT 14, in a library project, they will be declared like this:
public static int main=0x7f030004;

In other words, the constants are not final in a library project. The reason for this is simple: When multiple library projects are combined, the actual values of the fields (which must be unique) could collide. Before ADT 14, all fields were final, so as a result, all libraries had to have all their resources and associated Java code recompiled along with the main project whenever they were used. This was bad for performance, since it made builds very slow. It also prevented distributing library projects that didn't include the source code, limiting the usage scope of library projects.

这个不恒定字段标签 提示我们 ADT 14版本开始 application module 的 R文件声明 是这样的
public static final int main=0x7f030004;
而 library module 的R文件声明 将会是这样的
public static int main=0x7f030004;

在ADT 14 版本以前 无论是application module 还是library module都是 public static final int main=0x7f030004; 这种格式 这就导致了 资源重名问题 导致引用错误 细心的朋友可能发现了 我的两张图例中 都存在list_bt_1 这个字段名 只不过是一个是static int 另一个是 static final int 两种不同形式而已 这也就是官方提到的In other words... 这一段话的解释 了android 优化这一设计问题的原因

下面说一下解决方法
方式一 代码稍多
findViewById(R.id.list_bt_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

        }
    });

方式二
@Override
public void onClick(View view) {
/**
* switch - case 无法引用变量作为资源id 的指向
*/
int i = view.getId();
if (i == R.id.list_bt_1) {
Toast.makeText(this, "点击了1", Toast.LENGTH_SHORT).show();
}
}
当然这是一些原生的方式 有关注解之类的 也是可以的 这一块留给有需要的人自行研究 这里我就不说了 好了 本文完结 若有疑问 欢迎留言或私信

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,689评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,499评论 25 707
  • Android音频系统详解 参考好文: Android 音频系统:从 AudioTrack 到 AudioFlin...
    爱雨520阅读 13,402评论 2 7
  • 1、a,b都是基本类型 b=a,当a,b都是基本类型的时候,直接把a的对应内存的值拷给b,修改b对应的内存字符串是...
    101架钢琴阅读 259评论 0 0
  • 简述 很多时候有的业务隔离的很严重,但是有需要在一定的时机上互相通知,为了解决这个场景有一种比较合适的方案,就是事...
    范锦浩阅读 204评论 0 0