Resource IDs cannot be used in a switch statement in Android library modules

寫一個Library的時候當(dāng)用到layout里的ID時:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_institution_refresh:
                if (activity instanceof AbstractXListView.IXListViewListener) {
                    ((AbstractXListView.IXListViewListener) activity).onRefresh();
                } else if (onReloadButtonClickListener != null) {
                    onReloadButtonClickListener.onReloadButtonClick();
                }
                break;
        }
    }

往往會被提示Resource IDs cannot be used in a switch statement in Android library modules种樱。
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. Constant expression required
是的,SDK tools r14之后渐排,library的R文件中的ID都不是final的勉吻。因此不能這么使用了今瀑。
但是為什么Google要這么設(shè)置懒震?一番stackoverflow之后鳄厌,找到文檔:
http://tools.android.com/recent/buildchangesinrevision14

Library Project Revamp

Library projects were introduced to allow sharing of code and resources among projects.

If you are not familiar with library projects, I encourage you to read:

 [http://developer.android.com/guide/developing/projects/index.html#LibraryProjects](http://developer.android.com/guide/developing/projects/index.html#LibraryProjects)

As introduced, the library project relies on building the source code of the main project and of all library dependencies together as part of the build project for the main project. The library projects themselves don’t build anything that is used by projects using them.

Supporting Library Project is easy in Ant, but Eclipse (actually the JDT) requires that source code is located in a source folder under the project. To achieve this, ADT creates virtual source folders linking to the library source folders. Because library dependencies are controlled by the content of

 *project.properties* 

(formerly

 *default.properties*

), ADT must dynamically add and remove these virtual source folders whenever a project is opened and closed.

While this mechanism works, the Eclipse implementation has proven both fragile and cumbersome. For instance, Eclipse does not deal well with having 2 representations of the same on-disk file (one under the library project and the other under the main project). The two versions will get out of sync, requiring manual refresh and both will show compilation errors, polluting the Problems view.

Additionally, source-based library prevents distribution of re-usable components unless one is willing to include the source code.

To fix all of these issues, we have decided to move to library projects generating a jar file that is directly used by other projects.

In order to implement this, we had to change the way resource IDs are generated. In a regular projects, resource IDs are generated as

final static int

. These constants then get inlined into the classes that use them. This means the compiled classes do not access the values stored in, say,

 *R.layout.myui*

, but instead directly embed the value

 *0x000042*

.

To make the compiled classes not embed this value and instead access it from the R classes, library project will generate the resources IDs as

static int

only.

The resource IDs will still be generated as

final static int

in the final R class generated in the main project with the resources of the main projects and all required libraries.

For Ant users there are no changes in workflow. Building the main project will ensure the library project has been built and its output (a jar file) is there. Our Ant build improvements (see above) will make building the library project every time the main project is build an effective no-op.

For Eclipse users, the first time projects are opened, there will be an automated migration. The previous virtual folders (if any) will be removed, and a new classpath container is added to automatically contain the library jar files. In case the virtual source folders (named <libraryname>_src) are not removed, it is safe to remove them manually.

*Warning:* 

Generating IDs as non final in the library projects, means that the library code cannot treat these IDs as constants. This means, for example, that you can’t use res IDs in a switch statement.

At this time, library projects containing the jar file directly instead of the source code are not yet supported. We intend to add this support in r15.

To fix all of these issues, we have decided to move to library projects generating a jar file that is directly used by other projects.

In order to implement this, we had to change the way resource IDs are generated.
為了解決這些問題又谋,我們決定把library工程生成一個可以直接被其他工程使用的jar文件拼缝。
為了實(shí)現(xiàn)這一點(diǎn)括享,我們不得不改變resource ID生成的方式。

TODO..

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末珍促,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剩愧,更是在濱河造成了極大的恐慌猪叙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁卷,死亡現(xiàn)場離奇詭異穴翩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锦积,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門芒帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丰介,你說我怎么就攤上這事背蟆。” “怎么了哮幢?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵带膀,是天一觀的道長。 經(jīng)常有香客問我橙垢,道長垛叨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任柜某,我火速辦了婚禮嗽元,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喂击。我一直安慰自己剂癌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布惭等。 她就那樣靜靜地躺著珍手,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辞做。 梳的紋絲不亂的頭發(fā)上琳要,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音秤茅,去河邊找鬼稚补。 笑死,一個胖子當(dāng)著我的面吹牛框喳,可吹牛的內(nèi)容都是我干的课幕。 我是一名探鬼主播厦坛,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乍惊!你這毒婦竟也來了杜秸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤润绎,失蹤者是張志新(化名)和其女友劉穎撬碟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉撇,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呢蛤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棍郎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片其障。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涂佃,靈堂內(nèi)的尸體忽然破棺而出励翼,到底是詐尸還是另有隱情,我是刑警寧澤辜荠,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布抚笔,位于F島的核電站,受9級特大地震影響侨拦,放射性物質(zhì)發(fā)生泄漏殊橙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一狱从、第九天 我趴在偏房一處隱蔽的房頂上張望膨蛮。 院中可真熱鬧,春花似錦季研、人聲如沸敞葛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹谐。三九已至,卻和暖如春驼卖,著一層夾襖步出監(jiān)牢的瞬間氨肌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工酌畜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怎囚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓桥胞,卻偏偏與公主長得像恳守,于是被迫代替她去往敵國和親考婴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容