2013-01-16 12 views
33

、私はAndroidのコーディング私は日食の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(){} 
........ 
+0

これをご覧くださいhttp://adackoverflow.com/questions/338206/switch-statement-with-strings-in-javaそれはいくつかの興味深い答えを持っています – RNJ

答えて

34

switch文on Stringオブジェクトは、Java 1.7で導入された新機能です。残念なことにAndroidにはバージョン1.6または1.5が必要です。これが、そのような構造についてある程度の時間を忘れなければならない理由です。

StringMap<String, Method>で実行されるメソッドのマップを格納することで、if-statements-chainの使用を避けることができます。 Handlerオブジェクトで常にMethodをカプセル化できます。詳細はこちらをご覧ください:API 19のリリースキットカットでHow to remove large if-else-if chain

why-cant-i-switch-on-a-string

+0

、それは多くを助けてくれました。感謝! – jing1988ccc

+0

あなたは大歓迎です:) –

+26

この回答はKitKatのリリースで廃止されました。 [最新の回答](http://stackoverflow.com/questions/14367629/android-coding-with-switch-string/19722741#19722741) – mente

6

を使用するしかありません。 Switchを文字列で処理することはできません(少なくとも現在は)。以下のメッセージは明示的にそれに準拠しています

Androidには、コンパイラの準拠レベル5.0または6.0が必要です。代わりに「1.7」が見つかりました

88

をあなたは今、これを行うことができます!!!!これは、既存のプロジェクトのアンドロイドスタジオに必要な変更です。あなたがここに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 
} } 
+10

これを行うと、私のアプリはAPI 19よりも電話の恋人で動作するのですか? – Eddwhis

+4

@Eddwhisはい、それはまだ動作します! 出典:テスト済み 'switch(" test "){case" test ":Log.e(" Yay "、" It Works ");ブレーク; } 'on API 18! – bclymer

+0

ここで重要なのは 'compileOptions'ですか? – Tim

3

を使用していることはあなたがこれを行うことができます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; 
} 
5

とアンドロイドのための他の代替であることを確認最新のアンドロイドビルドツールを使用してください。 Androidのは、API最良の部分はあなたのminSdkVersionがを設定した場合、それは下の19よりも動作するということです19.

以降のJava 7の機能をサポートし始め引用このandroid developer page:あなたがminSdkVersionがを使用することができます

注意リソースの試行を除くすべての言語機能について、19より前の値。リソースを試してみるには、minSdkVersionを19にする必要があります。

0

ほとんどの人は少なくともJava 7以上でAndroidスタジオを使用していると仮定しているので、 はい、minSdkVersionバージョン<の場合でも、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を使用していたかのようです。
関連する問題