web-dev-qa-db-ja.com

switch caseステートメントエラー:case式は定数式でなければなりません

私のスイッチケースステートメントは、昨日完全に正常に機能します。しかし、今朝早めにコードを実行すると、Eclipseは赤色でcaseステートメントに下線を引くエラーを出し、「case式は定数式でなければならない、それは定数です。何が起こったのかわかりません。」以下は私のコードです:

public void onClick(View src)
    {
        switch(src.getId()) {
        case R.id.playbtn:
            checkwificonnection();
            break;

        case R.id.stopbtn:
            Log.d(TAG, "onClick: stopping srvice");
            Playbutton.setImageResource(R.drawable.playbtn1);
            Playbutton.setVisibility(0); //visible
            Stopbutton.setVisibility(4); //invisible
            stopService(new Intent(RakistaRadio.this,myservice.class));
            clearstatusbar();
            timer.cancel();
            Title.setText(" ");
            Artist.setText(" ");
            break;

        case R.id.btnmenu:
            openOptionsMenu();
            break;
        }
    }

すべてのR.id.intには、すべて下線が引かれています。

123

通常のAndroidプロジェクトでは、リソースRクラスの定数は次のように宣言されます。

public static final int main=0x7f030004;

ただし、ADT 14では、ライブラリプロジェクトで次のように宣言されます。

public static int main=0x7f030004;

つまり、定数はライブラリプロジェクトでは最終的なものではありません。したがって、コードはコンパイルされなくなります。

これに対する解決策は簡単です。switchステートメントをif-elseステートメントに変換します。

public void onClick(View src)
{
    int id = src.getId();
    if (id == R.id.playbtn){
        checkwificonnection();
    } else if (id == R.id.stopbtn){
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
    } else if (id == R.id.btnmenu){
        openOptionsMenu();
    }
}

http://tools.Android.com/tips/non-constant-fields

次を使用して、switchステートメントをif-elseステートメントにすばやく変換できます。

Eclipseでは
switchキーワードにカーソルを移動して押します Ctrl + 1 次に選択

「スイッチ」を「if-else」に変換します。

Android St​​udioで
switchキーワードにカーソルを移動して押します Alt + Enter 次に選択

「switch」を「if」に置き換えます。

267
Benito Bertoli

プロジェクトのプロパティで「Is Library」のチェックを外すとうまくいきました。

51
rick

次の方法で解決できます。

  1. ちょうどassign the value to Integer
  2. 変数最終にする

例:

public static final int cameraRequestCode = 999;

これがお役に立てば幸いです。

11
Hiren Patel

この問題の簡単な解決策は次のとおりです。

switchをクリックしてからCTL + 1、を押すと、スイッチがif-else blockステートメントに変更され、問題が解決します

8
Pir Fahim Shah

R.id. *。これは、ADT 14が最終的な静的intとして宣言されないため、switch caseコンストラクトで使用できないためです。代わりにif else句を使用できます。

8
Blackbelt

If-elseの代わりにNiceスイッチを保持するこの他のソリューションはどうですか。

private enum LayoutElement {
    NONE(-1),
    PLAY_BUTTON(R.id.playbtn),
    STOP_BUTTON(R.id.stopbtn),
    MENU_BUTTON(R.id.btnmenu);

    private static class _ {
        static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
    }

    LayoutElement(int id) {
        _.elements.put(id, this);
    }

    public static LayoutElement from(View view) {
        return _.elements.get(view.getId(), NONE);
    }

}

あなたのコードでこれを行うことができます:

public void onClick(View src) {
    switch(LayoutElement.from(src)) {
    case PLAY_BUTTTON:
        checkwificonnection();
        break;

    case STOP_BUTTON:
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
        break;

    case MENU_BUTTON:
        openOptionsMenu();
        break;
    }
}

列挙型は静的であるため、影響は非常に限定的です。懸念される唯一のウィンドウは、関連するダブルルックアップです(最初は内部SparseArrayで、後でスイッチテーブルで)

つまり、この列挙型は、必要に応じてidへの参照を保持することで、アイテムを流itemsに取得するためにも使用できますが、それは別の話です。

7
pablisco

クラスで宣言された変数を持つ関数でスイッチを使用すると、このエラーがスローされました:

private void ShowCalendar(final Activity context, Point p, int type) 
{
    switch (type) {
        case type_cat:
            break;

        case type_region:
            break;

        case type_city:
            break;

        default:
            //sth
            break;
    }
}

クラスの先頭の変数にfinalを宣言すると、問題は解決しました。

final int type_cat=1, type_region=2, type_city=3;
3
aimiliano

私が言及したいのは、プロジェクトにライブラリを追加しようとしたときに同じ状況に出くわしたことです。突然、すべてのswitchステートメントがエラーを表示し始めました!

今、追加したライブラリを削除しようとしましたが、それでも動作しませんでした。どのように "私がプロジェクトをきれいにしたとき"すべてのエラーがちょうど消えました!

2
Muhammad Riyaz