在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

摘要:
转移自:http://www.jianshu.com/p/89687f618837原因分析当我们使用switch-case语句访问Android依赖库中的资源ID时,将报告一个错误,如下图所示。报告的错误是case分支后面的参数必须是常量。换句话说,这个问题的原因是Android库中生成的R.java中的资源ID不是常量:在库中打开R.java,发现这是真的。每个资源ID都不是

 转自:http://www.jianshu.com/p/89687f618837

原因分析

  当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误,报的错误是case分支后面跟的参数必须是常数,换句话说出现这个问题的原因是Android library中生成的R.java中的资源ID不是常数:

 library error

打开library中的R.java,发现确实如此,每一个资源ID都没有被声明为final:

library R.java
library R.java

  但是当你打开你的主工程,在onClick、onItemClick等各种回调方法中是可以通过switch-case语句来访问资源ID的,因为在主工程的R.java中资源ID都被声明为了final常量。

  project中能够通过switch-case语句正常引用资源ID:

project right
project right

  project中的R.java:

project R.java
project R.java

解决方案

  既然是由于library的R.java中的资源ID不是常量引起的,我们可以在library中通过if-else-if条件语句来引用资源ID,这样就避免了这个错误:

library use
library use

参考资料:

  为了进一步了解问题的具体原因,在万能的StackOverflow上还真搜到了这个问题:

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. Therefore your code would no longer compile.

The solution for this is simple: Convert the switch statement into an if-else statement.

public void onClick(View src)
{
    int id = src.getId();
    if (id == R.id.playbtn){
        checkwificonnection();
    } else if (id == R.id.stopbtn){
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
    } else if (id == R.id.btnmenu){
        openOptionsMenu();
    }
}

http://tools.android.com/tips/non-constant-fields

Tip
You can quickly convert a switch statement to an if-else statement using Eclipse's quick fix.

Click on the switch keyword and press Ctrl + 1 then select

Convert 'switch' to 'if-else'.

  问题详见:switch case statement error: case expressions must be constant expression

免责声明:文章转载自《在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Asp.net中基于Forms验证的角色验证授权在Mac OSX EI Capitan下安装xgboost的吐血经历下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

第二次实验报告

C程序设计实验报告 实验项目: 4.3.1 if语句的应用 4.3.2 switch/case语句的应用 4.3.3 switch/case语句嵌套结构if语句的应用 4.3.4 switch/case结构的嵌套应用 4.3.5 分析程序 姓名:欧阳思健        实验地点:514实验教室         实验时间:2019.04.03 一、实验目...

高质量C++/C 编程指南一

首先,强烈推荐林锐博士这本《高质量C++/C 编程指南》,请花一两个小时认真阅读这本百页经书,你将会获益匪浅。草草看过,个人收获记录如下。 头文件的作用略作解释:(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库...

帝国CMS实现一二级导航及其高亮

帝国CMS实现一二级导航及其高亮   可以用以下方法实现一二级导航 <li id="<?=$GLOBALS[navclassid]==0?'nav_select':''?>"><a href="http://t.zoukankan.com/">首页</a></li> [e:loop={'se...

0930

今天主要学习了if分支语句以及for循环语句 语句分为三类:顺序、分支、循环 分支语句分几类: 第一类:if(表达式) //表达式返回值是True或False{}说明:1.表达式返回的是bool值;2.小括号和花括号后面不需要加分号。 第二类:二选一 if(表达式){}else{} 第三类:多选一 if(表达式){}else if{}else if{}.....

switch语句不能使用枚举的成员变量

出现问题: 写了个代码,需要使用枚举的来判断对于的事务处理 然而这里的编译器报错:constant expression required switch 的case中,必须要用常量,想了一下,枚举里面的code是可以相同的 实在不想在 类里面 定义 public static final int code 这样的常量来代替枚举 解决方法: 在枚举类中添加...

java 根据实体对象生成 增删改的SQL语句 ModelToSQL

package com.xxx.utils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; import java.util.Vector; import org.apache.commons.lang3....