[java] 사례 문 전환 오류 : 사례 표현식은 상수 표현식이어야합니다.

내 스위치 케이스 설명은 어제 완벽하게 작동합니다. 그러나 오늘 아침에 코드를 일찍 실행하면 이클립스에서 빨간색으로 사례 진술에 밑줄을 긋는 오류가 발생했습니다. 아래 내 코드는 다음과 같습니다.

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.

Eclipse에서
커서를 switch키워드로 이동 하고 Ctrl+를 1누른 다음

‘스위치’를 ‘if-else’로 변환하십시오.

Android Studio에서
커서를 switch키워드로 이동 하고 Alt+를 Enter누른 다음

‘스위치’를 ‘if’로 교체하십시오.


답변

프로젝트 속성에서 “Is Library”를 선택 취소하면 나에게 도움이되었습니다.


답변

이 방법으로 해결책을 찾을 수 있습니다.

  1. 그냥 지정 정수
  2. 최종 변수 로 만들기

예:

public static final int cameraRequestCode = 999;

이것이 도움이되기를 바랍니다.


답변

R.id. *, ADT 14는 더 이상 final static int로 선언되지 않으므로 스위치 케이스 구성에 사용할 수 없습니다. if else 절을 ​​대신 사용할 수 있습니다.


답변

이 문제에 대한 간단한 해결책은 다음과 같습니다.

스위치를 클릭 한 다음 CTL + 1 을 누르면 스위치가 if-else block 문으로 변경되고 문제가 해결됩니다.


답변

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

}

따라서 코드에서 다음을 수행 할 수 있습니다.

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에 대한 참조를 유지하여 유창한 방식으로 항목을 가져 오는 데 사용할 수 있지만 다른 이야기입니다.


답변

클래스에서 선언 된 변수가있는 함수에서 스위치를 사용할 때이 오류가 발생했습니다.

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;