사례 문 전환 오류 : 사례 표현식은 상수 표현식이어야합니다.
내 스위치 케이스 설명은 어제 완벽하게 작동합니다. 그러나 오늘 아침에 코드를 일찍 실행하면 이클립스에서 빨간색으로 사례 설명에 밑줄을 긋는 오류가 발생했습니다. 대소 표현식은 상수 표현식이어야하며 상수는 무엇인지 알 수 없습니다. 아래 내 코드는 다음과 같습니다.
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는 모두 밑줄이 그어져 있습니다.
일반 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
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'.
Unchecking "Is Library" in the project Properties worked for me.
Solution can be done be this way:
- Just assign the value to Integer
- Make variable to final
Example:
public static final int cameraRequestCode = 999;
Hope this will help you.
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.
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
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.
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;
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 !
'programing tip' 카테고리의 다른 글
SqlDataAdapter 및 SqlDataReader (0) | 2020.07.10 |
---|---|
두 각도의 가장 작은 차이 (0) | 2020.07.09 |
Mac OS X에서 정적 라이브러리 (.a)의 대상 아키텍처를 어떻게 확인합니까? (0) | 2020.07.09 |
bash에서 문자 다음에 모든 텍스트를 제거하려면 어떻게합니까? (0) | 2020.07.09 |
리사이클 러보기 및 다양한 유형의 행 인플레이션 처리 (0) | 2020.07.09 |