it-source

스위치 대/소문자 문 오류: 대/소문자 표현은 상수 표현이어야 합니다.

criticalcode 2022. 12. 9. 21:50
반응형

스위치 대/소문자 문 오류: 대/소문자 표현은 상수 표현이어야 합니다.

어제 내 교환 케이스 진술서는 완벽하게 작동했어.그러나 오늘 아침 일찍 코드를 실행했을 때 이클립스는 대소문자의 밑줄을 빨간색으로 칠 때 오류가 발생하여 대소문자의 표현은 반드시 일정한 표현이어야 하며, 나는 무슨 일이 일어났는지 모른다.아래 코드는 다음과 같습니다.

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

빠르게 변환할 수 있습니다.switch에 대한 진술if-else다음 명령어를 사용합니다.

인 이클립스
커서를 이동하다switch키워드를 누르고 + 키를 눌러 선택합니다.

'switch'를 'if-else'로 변환합니다.

Android Studio에서
커서를 이동하다switch키워드를 누르고 + 키를 눌러 선택합니다.

'switch'를 'if'로 바꿉니다.

Properties에서 "Is Library"를 선택 해제했습니다.

해결 방법은 다음과 같습니다.

  1. Integer에 할당하기만 하면 됩니다.
  2. 변수에서 최종으로 변경

예:

public static final int cameraRequestCode = 999;

이게 도움이 되길 바라.

R.id.*. ADT 14는 최종 스태틱 int로 선언되지 않기 때문에 스위치케이스 구성에서는 사용할 수 없습니다.대신 if else 절을 사용할 수 있습니다.

이 문제의 간단한 해결 방법은 다음과 같습니다.

스위치를 클릭한 후 CTL+1을 누릅니다.스위치를 if-else block 스테이트먼트로 변경하여 문제를 해결합니다.

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

enum은 정적이기 때문에 영향은 매우 제한적입니다.관련된 유일한 창은 이중 검색뿐입니다(내부 Sparse Array에서 최초, 스위치테이블에서 이후).

즉, 이 열거형을 사용하여 ID를 계속 참조함으로써 필요한 경우 항목을 유창하게 가져올 수도 있습니다.그건 나중에 얘기하자

클래스에 선언된 변수를 가진 함수로 스위치를 사용하면 다음과 같은 오류가 발생합니다.

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 the the를 선언하자 문제가 되었다.final이치노

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

그 점을 언급하고 싶습니다만, 제 프로젝트에 라이브러리를 추가하려고 했을 때도 같은 상황이었습니다.갑자기 모든 스위치스테이트먼트에 에러가 표시되기 시작했습니다.

지금 추가한 라이브러리를 제거하려고 했는데, 제거가 되지 않았습니다."프로젝트를 청소했을 때" 오류는 모두 사라졌습니다!

변수를 최종으로 선언하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/9092712/switch-case-statement-error-case-expressions-must-be-constant-expression

반응형