問題描述:
當我們在Android依賴庫中使用switch-case語句訪問資源ID時會報如下錯誤,報的錯誤是case分支后面跟的參數必須是常數。
原因分析:
出現這個問題的原因是Android library中生成的R.java中的資源ID不是常數。
在library中這樣寫:
打開library中的R.java,發現確實如此,每一個資源ID都沒有被聲明為final:
在正常工程,非library工程中,資源ID被聲明為final:
解決方案:
既然是由于library的R.java中的資源ID不是常量引起的,我們可以在library中通過if-else-if條件語句來引用資源ID,這樣就避免了這個錯誤:
原因溯源:
合并多個library項目時,字段的實際值(必須唯一)可能會發生沖突。在ADT 14之前,所有字段都是最終字段,因此,所有library在使用時都必須與主項目一起重新編譯其所有資源和關聯的Java代碼。這對性能不利,因為它使構建速度非常慢。它還阻止分發不包含源代碼的library項目,從而限制了library項目的使用范圍。
字段不再是final的原因是,這意味著庫jar可以被編譯一次并直接在其他項目中重用。除了允許分發庫項目的二進制版本(r15中提供)之外,這還使構建速度更快。
switch語句要求所有大小寫標簽(例如)R.id.button1在編譯時都是常量(這樣,值可以直接復制?到.class文件中)。
解決方案很簡單:將switch語句轉換為if-else語句。幸運的是,這在Eclipse中非常容易。只需將插入符號放在switch關鍵字上,然后按Ctrl-1(或在Mac上為Cmd-1):
Android Studio快捷鍵switch case 輕松轉換為if else
選中“switch”,ALt+Enter(或在Mac上為Option+Return)同時選中,彈出對話框,選擇“Replace 'switch' with 'if'”,
選中之后,點擊,即可將“switch”轉換為了'if'樣式,如果需要轉回“switch”,同樣的快捷鍵方式,輕松轉換。