問題描述:
當(dāng)我們?cè)贏ndroid依賴庫(kù)中使用switch-case語(yǔ)句訪問資源ID時(shí)會(huì)報(bào)如下錯(cuò)誤,報(bào)的錯(cuò)誤是case分支后面跟的參數(shù)必須是常數(shù)。

原因分析:
出現(xiàn)這個(gè)問題的原因是Android library中生成的R.java中的資源ID不是常數(shù)。
在library中這樣寫:

打開library中的R.java,發(fā)現(xiàn)確實(shí)如此,每一個(gè)資源ID都沒有被聲明為final:

在正常工程,非library工程中,資源ID被聲明為final:

解決方案:
既然是由于library的R.java中的資源ID不是常量引起的,我們可以在library中通過if-else-if條件語(yǔ)句來(lái)引用資源ID,這樣就避免了這個(gè)錯(cuò)誤:

原因溯源:
合并多個(gè)library項(xiàng)目時(shí),字段的實(shí)際值(必須唯一)可能會(huì)發(fā)生沖突。在ADT 14之前,所有字段都是最終字段,因此,所有l(wèi)ibrary在使用時(shí)都必須與主項(xiàng)目一起重新編譯其所有資源和關(guān)聯(lián)的Java代碼。這對(duì)性能不利,因?yàn)樗箻?gòu)建速度非常慢。它還阻止分發(fā)不包含源代碼的library項(xiàng)目,從而限制了library項(xiàng)目的使用范圍。
字段不再是final的原因是,這意味著庫(kù)jar可以被編譯一次并直接在其他項(xiàng)目中重用。除了允許分發(fā)庫(kù)項(xiàng)目的二進(jìn)制版本(r15中提供)之外,這還使構(gòu)建速度更快。
switch語(yǔ)句要求所有大小寫標(biāo)簽(例如)R.id.button1在編譯時(shí)都是常量(這樣,值可以直接復(fù)制?到.class文件中)。
解決方案很簡(jiǎn)單:將switch語(yǔ)句轉(zhuǎn)換為if-else語(yǔ)句。幸運(yùn)的是,這在Eclipse中非常容易。只需將插入符號(hào)放在switch關(guān)鍵字上,然后按Ctrl-1(或在Mac上為Cmd-1):

Android Studio快捷鍵switch case 輕松轉(zhuǎn)換為if else
選中“switch”,ALt+Enter(或在Mac上為Option+Return)同時(shí)選中,彈出對(duì)話框,選擇“Replace 'switch' with 'if'”,

選中之后,點(diǎn)擊,即可將“switch”轉(zhuǎn)換為了'if'樣式,如果需要轉(zhuǎn)回“switch”,同樣的快捷鍵方式,輕松轉(zhuǎn)換。