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 application?
if(){}
else if(){}
else if(){}
........
switch
オブジェクトのString
ステートメントは、Java 1.7で導入された新機能です。残念ながらAndroidバージョン1.6または1.5が必要です。これはそのような構造についてしばらくの間忘れなければならない理由。
特定のString
:Map<String, Method>
に対して実行されるメソッドのマップを保存することにより、if-statements-chainの使用を回避できます。 Method
オブジェクトでいつでもHandler
カプセル化できます。詳細はこちらをご覧ください: 大きなif-else-ifチェーンを削除する方法
そして
API 19 KitKatのリリースにより、これが可能になりました!!!!これは、Android既存のプロジェクトのスタジオに必要な変更です。JDK1.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 } }
あなたは選択肢がありません。 Switch
を文字列で動作させることはできません(少なくとも今のところ)。次のメッセージは明示的にそれに従います。
Androidには、コンパイラー準拠レベル5.0または6.0が必要です。代わりに「1.7」が見つかりました
これは、最新のAndroidビルドツールを使用して実行できます。 Androidは、API 19以降、Java 7機能のサポートを開始しました。
最良の部分は、minSdkVersionを19未満に設定しても機能することです。これを引用して Android開発者ページ :
リソースでの試行を除くすべての言語機能について、19より前の値でminSdkVersionを使用できることに注意してください。リソースでtryを使用する場合は、19のminSdkVersionも使用する必要があります。
Android with Java 5または6
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;
}
ほとんどの人がAndroid最低でもJava 7以上のStudioを使用していると仮定するので、答えははい、minSdkVersionバージョン<19の場合でもAndroidで文字列を切り替えることができます。 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
を使用しているかのようです。