12

テキスト付きの画像のグリッドがあり、それぞれが異なるアクティビティを開くアプリを作成しています。それは正常に動作しますが、設計上の目的で my を置き換えたいのですがif-else statements(switch statementsできると思います)、動作しません。現在、各画像にラベルを設定する作業コードは次のとおりです。

if(position == 0)
        textView.setText(R.string.zero);
    else if(position == 1)
        textView.setText(R.string.one);
    else if(position == 2)
        textView.setText(R.string.two);
    else if(position == 3)
        textView.setText(R.string.three);
    else if(position == 4)
        textView.setText(R.string.four);
    else if(position == 5)
        textView.setText(R.string.five);
ect....

使いたい:

switch(position)
case 0:
   textView.setText(R.string.zero);    
case 1:
   textView.setText(R.string.one);
case 2:
   textView.setText(R.string.two);    
case 3:
   textView.setText(R.string.three);
case 4:
   textView.setText(R.string.four);    

しかし、私がそれを行ったとき、ラベルは私が定義した最後のものでした(私の例では「4」になります)。intentまた、各オブジェクトが変数で異なるものを開始するための同様のコードもありますが、これpositionは反対のことを行い、すべての意図を最初のものと等しくします。私の構文は間違っていますか、それとも私の状況ではうまくいきませんか?

4

9 に答える 9

62

break;の各ステートメントの後にする必要がありますcase。そうしないと、実行が下に流れます (必要なケースより下のすべてのケースも呼び出されます)。したがって、常に最後のケースが取得されます。

switch(position) {
case 0:
    textView.setText(R.string.zero); 
    break; 
case 1:
    textView.setText(R.string.one);
    break; 
case 2:
    textView.setText(R.string.two);   
    break;  
case 3:
    textView.setText(R.string.three);
    break; 
case 4:
    textView.setText(R.string.four); 
    break; 
}

これは、 を使用する場合と使用しない場合を説明する公式チュートリアルbreak;です。

于 2013-06-27T14:07:57.660 に答える
7

これが解決策です。breakそれぞれのケースを回避するために使用する必要があります。

switch(position)
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
   textView.setText(R.string.one);
   break;
case 2:
   textView.setText(R.string.two);  
   break;  
case 3:
   textView.setText(R.string.three);
   break;
case 4:
   textView.setText(R.string.four);    
   break;

switch ステートメントに関するオラクルのドキュメントを読むことをお勧めします。

于 2013-06-27T14:08:04.817 に答える
1

各 break ステートメントは、囲んでいる switch ステートメントを終了します。制御フローは、switch ブロックに続く最初のステートメントから続行されます。break ステートメントがないと、switch ブロック内のステートメントが失敗するため、break ステートメントが必要です。一致する case ラベルの後のすべてのステートメントは、後続の case ラベルの式に関係なく、break ステートメントが検出されるまで順番に実行されます。

Switch は if-else ステートメントよりも高速です

結論:デフォルトはオプションです(スイッチのelseステートメントのように機能します)、Breakは必須です。

興味深い事実: break ステートメントを配置するのを忘れたとしても、コンパイル エラーは表示されません。

于 2014-04-11T19:24:52.400 に答える
1

いずれの場合もswitchが必要breakです。しかし、あなたの場合、以下に示すように配列を定義することで、はるかに簡単に実行できます。

String values = {R.string.zero, R.string.one, R.string.two, ... };

これを使用して textView を設定します。textView.setText(values[position]);

于 2014-12-24T21:18:10.660 に答える