switch case statement error: case expressions must be constant expression

JavaAndroidSwitch Statement

Java Problem Overview


My switch-case statement works perfectly fine yesterday. But when I run the code earlier this morning eclipse gave me an error underlining the case statements in color red and says: case expressions must be constant expression, it is constant I don't know what happened. Here's my code below:

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;
    	}
    }

All R.id.int are all underlined in red.

Java Solutions


Solution 1 - Java

In a regular Android project, constants in the resource R class are declared like this:

public static final int main=0x7f030004;

However, as of ADT 14, in a library project, they will be declared like this:

public static int main=0x7f030004;

In other words, the constants are not final in a library project. Therefore your code would no longer compile.

The solution for this is simple: Convert the switch statement into an if-else statement.

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

You can quickly convert a switch statement to an if-else statement using the following:

In Eclipse
Move your cursor to the switch keyword and press Ctrl + 1 then select > Convert 'switch' to 'if-else'.

In Android Studio
Move your cursor to the switch keyword and press Alt + Enter then select > Replace 'switch' with 'if'.

Solution 2 - Java

Unchecking "Is Library" in the project Properties worked for me.

Solution 3 - Java

Solution can be done be this way:

  1. Just assign the value to Integer
  2. Make variable to final

Example:

public static final int cameraRequestCode = 999;

Hope this will help you.

Solution 4 - Java

R.id.*, since ADT 14 are not more declared as final static int so you can not use in switch case construct. You could use if else clause instead.

Solution 5 - Java

Simple solution for this problem is :

Click on the switch and then press CTL+1, It will change your switch to if-else block statement, and will resolve your problem

Solution 6 - Java

How about this other solution to keep the nice switch instead of an if-else:

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);
	}

}

So in your code you can do this:

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;
    }
}

Enums are static so this will have very limited impact. The only window for concern would be the double lookup involved (first on the internal SparseArray and later on the switch table)

That said, this enum can also be utilised to fetch the items in a fluent manner, if needed by keeping a reference to the id... but that's a story for some other time.

Solution 7 - Java

It was throwing me this error when I using switch in a function with variables declared in my class:

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;
    }
}

The problem was solved when I declared final to the variables in the start of the class:

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

Solution 8 - Java

I would like to mention that, I came across the same situation when I tried adding a library into my project. All of a sudden all switch statements started to show errors!

Now I tried to remove the library which I added, even then it did not work. how ever "when I cleaned the project" all the errors just went off !

Solution 9 - Java

Simply declare your variable to final

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHeartlessArchangelView Question on Stackoverflow
Solution 1 - JavaBenito BertoliView Answer on Stackoverflow
Solution 2 - JavarickView Answer on Stackoverflow
Solution 3 - JavaHiren PatelView Answer on Stackoverflow
Solution 4 - JavaBlackbeltView Answer on Stackoverflow
Solution 5 - JavaPir Fahim ShahView Answer on Stackoverflow
Solution 6 - JavapabliscoView Answer on Stackoverflow
Solution 7 - JavaaimilianoView Answer on Stackoverflow
Solution 8 - JavaMuhammad RiyazView Answer on Stackoverflow
Solution 9 - JavaManoj RawatView Answer on Stackoverflow