在Android library中不能使用switch-case語(yǔ)句訪問資源ID的原因分析及解決方案

問題描述:

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

資源ID需要是常數(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)換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容