переключить регистр ошибок: регистр должен быть константным выражением - PullRequest
123 голосов
/ 01 февраля 2012

Вчера моя инструкция переключения отлично работает. Но когда я запускал код ранее этим утром, затмение дало мне ошибку, подчеркивая выражения 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 подчеркнуты красным.

Ответы [ 8 ]

266 голосов
/ 01 февраля 2012

В обычном проекте 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, используя следующее:

In Eclipse Переместите курсор на ключевое слово switch и нажмите Ctrl + 1 , затем выберите

Преобразовать 'switch' в 'if-else'.

В Android Studio Переместите курсор на ключевое слово switch и нажмите Alt + Введите , затем выберите

Замените 'switch' на 'if'.

51 голосов
/ 06 ноября 2013

Снятие галочки с «Is Library» в проекте Properties у меня сработало.

11 голосов
/ 01 февраля 2016

Решение может быть выполнено следующим образом:

  1. Просто присвойте значение Целое число
  2. Сделайте переменную до окончательный

Пример:

public static final int cameraRequestCode = 999;

Надеюсь, это поможет вам.

8 голосов
/ 23 марта 2014

Простое решение этой проблемы:

Нажмите на переключатель , а затем нажмите CTL + 1, . Он изменит ваш переключатель на оператор блока if-else и решит вашу проблему

8 голосов
/ 01 февраля 2012

R.id. *, поскольку ADT 14 больше не объявляются как final static int, поэтому вы не можете использовать их в конструкции case switch. Вместо этого вы можете использовать предложение if.

7 голосов
/ 11 марта 2014

Как насчет этого другого решения, чтобы сохранить хороший переключатель вместо 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, а затем в таблице переключателей)

Тем не менее, это перечисление также может быть использовано для быстрого извлечения элементов, если необходимо, сохраняя ссылку на идентификатор ... но это история для другого времени.

3 голосов
/ 10 сентября 2013

Это выдавало мне эту ошибку, когда я использовал switch в функции с переменными, объявленными в моем классе:

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;
2 голосов
/ 18 июня 2013

Я хотел бы отметить, что я столкнулся с той же ситуацией, когда пытался добавить библиотеку в свой проект.Внезапно все операторы switch начали показывать ошибки!

Теперь я попытался удалить добавленную библиотеку, даже тогда она не работала.как бы то ни было " когда я очистил проект " все ошибки просто исчезли!

...