(转)Android 升级 ADT 之后报错之一 case语句 .
时间:2022-03-15 17:54
下面文章大意是指:在一般的Android项目中,R类的常量都是用final定义的,但ADT 14之后,如果在library 项目中,它会没有final关键字,
估计在新ADT中,资源文件会变成一个library...,
在switch语句的case中,如果使用 R.id.xxx 则会提示有问题,不允许非常量在case语句中。
Google提供的一个方法就是把它转化为if-else语句,即在switch语句处 Ctrl+1 然后可以替换成if-else.语句。
Non-constant Fields in Case Labels
In a regular Android project, constants in the resource R
class are declared like this:
publicstaticfinalintmain=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. The reason for this is simple: When multiple library
projects are combined, the actual values of the fields (which must be
unique) could collide. Before ADT 14, all fields were final, so as a
result, all libraries had to have all their resources and associated Java
code recompiled along with the main project whenever they were used. This
was bad for performance, since it made builds very slow. It also prevented
distributing library projects that didn‘t include the source code,
limiting the usage scope of library projects.
The reason the fields are no longer final is that it means that
the library jars can be compiled once and reused directly in other
projects. As well as allowing distributing binary version of library
projects (coming in r15), this makes for much faster
builds. However, it has one impact on the source code of the library. Code of the following form will no longer compile:
int id = view.getId();
switch (id) {
case R.id.button1:
action1();
break;
case R.id.button2:
action2();
break;
case R.id.button3:
action3();
break;
}
That‘s because the switch statement requires all the
case labels, such as R.id.button1 , to be constant at compile
time (such that the values can be directly copied into the
.class files).
The solution for this is simple: Convert the switch statement into an
if-else statement. Fortunately, this is very easy in Eclipse. Just place
the caret on the switch keyword, and press Ctrl-1 (or Cmd-1 on Mac):
In the above scenario, it will turn the switch statement
into this:
int id = view.getId();
if (id == R.id.button1) {
action1();
} else if (id == R.id.button2) {
action2();
} else if (id == R.id.button3) {
action3();
}
This is typically in UI code and the performance impact is
negligible.
We have a detector which finds these errors (non-constant case labels
referencing an R field) and provides a brief explanation of the problem
(and points to this page for more information.)
More
information about the automatic detection.
P.S. If your switch statement looks like this:
switch
(view.getId()) {
then you end up with an inefficient if/else chain where
each if check repeats the view.getId() call. Just extract
this expression first (using the "Extract Local Variable" refactoring
keystroke), then convert the switch statement.
http://tools.android.com/tips/non-constant-fields
|
(转)Android 升级 ADT 之后报错之一 case语句 .,布布扣,bubuko.com
相关推荐
- Android系统编程入门系列之界面Activity交互响应
- 新型横向移动工具原理分析、代码分析、优缺点以及检测方案
- uni-app滚动视图容器(scroll-view)之监听上拉事件
- uniapp h5,app两端复制文本
- Android系统编程入门系列之界面Activity响应丝滑的传统动画
- 【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
- 诺基亚短信生成!太好玩了
- iOS 跳转App Store进行评分
- 开发一个即时通讯App
- 关闭苹果IOS app自动更新
电脑软件
本类排行
- 1关闭苹果IOS app自动更新
- 2iOS 跳转App Store进行评分
- 3诺基亚短信生成!太好玩了
- 4Android系统编程入门系列之界面Activity响应丝滑的传统动画
- 5uniapp h5,app两端复制文本
- 6uni-app滚动视图容器(scroll-view)之监听上拉事件
- 7新型横向移动工具原理分析、代码分析、优缺点以及检测方案
- 8Android系统编程入门系列之界面Activity交互响应
- 9开发一个即时通讯App
- 10【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn