带开关的 Android 编码(字符串)
Posted
技术标签:
【中文标题】带开关的 Android 编码(字符串)【英文标题】:Android coding with switch (String) 【发布时间】:2012-12-31 07:35:16 【问题描述】:当我尝试一些代码时,我正在 Eclipse 上开发一个 android 应用程序
switch(String)
......
它给了我以下错误
Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
所以我将编译器更改为 1.7,然后它又给了我一个错误
Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
那么,有没有办法让 switch(String) 在 android 应用程序中工作? 或者我别无选择,只能使用
if()
else if()
else if()
........
【问题讨论】:
看看这个***.com/questions/338206/…它有一些有趣的答案 【参考方案1】:随着 API 19 KitKat 的发布,您现在可以做到这一点!!!!这是现有项目的 android studio 所需的更改。确保您使用的是 JDK 1.7 或更高版本以及 Gradle 插件 0.6.1 或更高版本
android compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig minSdkVersion 7 targetSdkVersion 19 compileOptions sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7
【讨论】:
@Eddwhis 是的,它仍然可以工作!来源:在 API 18 上测试switch ("test") case "test": Log.e("Yay", "It Works"); break;
!
那么compileOptions
是这里的关键吗?
@bclymer 你说对了一部分。它确实在 API 级别 19 以下工作,因为它与编译器行为有关,而不是与设备行为有关。但是,由于 Java 优化,您的测试什么也没证明。编译器可能会尝试通过重用字面量中的 String 对象来减少内存使用量 - 因此您的测试 可能会或可能不会在 Java 1.7 之前通过。【参考方案2】:
switch
对 String
对象的声明是 Java 1.7 中引入的一个新特性。不幸的是,Android 需要 1.6 或 1.5 版本。这就是为什么您必须暂时忘记此类结构的原因。
您可以通过存储将针对某些String
:Map<String, Method>
执行的方法的映射来避免使用 if-statements-chain。你总是可以用一些Handler
对象封装Method
它。在这里查看更多信息:How to remove large if-else-if chain
和
why-cant-i-switch-on-a-string
【讨论】:
KitKat 的发布不推荐使用此答案。检查latest answer【参考方案3】:你别无选择。你不能用字符串工作Switch
(至少现在是这样)。以下消息明确符合这一点。
Android 要求编译器合规级别为 5.0 或 6.0。改为找到“1.7”
【讨论】:
【参考方案4】:您可以使用最新的 android 构建工具来做到这一点。 Android 从 API 19 开始支持 Java 7 功能。
最好的部分是,即使您将 minSdkVersion 设置为低于 19,它也能正常工作。引用 android developer page:
请注意,对于除 try with resources 之外的所有语言功能,您都可以使用值早于 19 的 minSdkVersion。如果您想对资源使用 try,您还需要使用 19 的 minSdkVersion。
【讨论】:
【参考方案5】:这是带有 java 5 或 6 的 android 的另一种选择
public enum Command text, image, other;
String enumTest = "text";
try
Command command = Command.valueOf(enumTest);
catch(Exception e)
Log.e("Tag", "Command not found: " + enumTest);
switch (command)
case image:
break;
case text:
break;
【讨论】:
【参考方案6】:由于我假设大多数人使用的 Android Studio 至少具有 Java 7,那么现在的答案是,是的,您可以在 Android 中切换字符串,即使 minSdkVersion 版本 Java SE Documentation:
public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg)
String typeOfDay;
switch (dayOfWeekArg)
case "Monday":
typeOfDay = "Start of work week";
break;
case "Tuesday":
case "Wednesday":
case "Thursday":
typeOfDay = "Midweek";
break;
case "Friday":
typeOfDay = "End of work week";
break;
case "Saturday":
case "Sunday":
typeOfDay = "Weekend";
break;
default:
throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
return typeOfDay;
文档还注明:
使用字符串切换通常比链式if
-else
更快。
好像每个案例都使用String.equals
。
【讨论】:
以上是关于带开关的 Android 编码(字符串)的主要内容,如果未能解决你的问题,请参考以下文章