Intereting Posts
Дата заезда с сегодняшней датой Не удается разрешить символ AppCompatActivity. Поддержка библиотек v7 не распознается? Android создает spinner с элементами, которые имеют скрытое значение и отображают некоторый текст? GetSize () дает мне ошибки Android Studio: Android Manifest не существует или имеет неправильный корневой тег Нужно ли мне всегда использовать последнюю цельSdkVersion? Не удалось загрузить адаптер модуля для класса. Убедитесь, что для этого модуля была запущена генерация кода Как защитить открытый ключ Google Play при выполнении InApp Billing Группировать несколько приложений под одним и тем же значком в Application launcher Android: сделать все вокруг Dialog темнее, чем по умолчанию Приложение Android Facebook: срок доступа к токену (expires_in) всегда равен 0 Android studio 2.3: Не удалось инициализировать класс org.jetbrains.kotlin.android.actions.NewKotlinActivityAction Является ли поддержка телефонной почты автономным кэшем хранилища? Динамическое обновление заголовка FragmentPagerAdapter GetWritableDatabase () VS getReadableDatabase ()

Если-else работает, не переключайте

Я создаю приложение, которое имеет сетку изображений с текстом, и каждый из них открывает другое действие. Он отлично работает, но только для целей проектирования. Я хочу заменить мои if-else statements switch statements (которые, как я полагаю, могу сделать), однако это не сработает. Сейчас мой рабочий код для установки метки на каждом изображении:

 if(position == 0) textView.setText(R.string.zero); else if(position == 1) textView.setText(R.string.one); else if(position == 2) textView.setText(R.string.two); else if(position == 3) textView.setText(R.string.three); else if(position == 4) textView.setText(R.string.four); else if(position == 5) textView.setText(R.string.five); ect.... 

Я хочу использовать:

 switch(position) case 0: textView.setText(R.string.zero); case 1: textView.setText(R.string.one); case 2: textView.setText(R.string.two); case 3: textView.setText(R.string.three); case 4: textView.setText(R.string.four); 

Но когда я сделал это, ярлык был последним, который я определил (в моем примере это было бы «четыре»). У меня также есть аналогичный код для каждого объекта, чтобы начать другое intent с помощью переменной position но это делает обратное и делает каждое намерение равным первому. Является ли мой синтаксис неправильным или это не сработает для моей ситуации?

Solutions Collecting From Web of "Если-else работает, не переключайте"

Вам нужно break; После каждого утверждения в case , в противном случае выполнение течет вниз (все случаи ниже того, который вы хотите, также вызываются), поэтому вы всегда получите последний случай.

 switch(position) { case 0: textView.setText(R.string.zero); break; case 1: textView.setText(R.string.one); break; case 2: textView.setText(R.string.two); break; case 3: textView.setText(R.string.three); break; case 4: textView.setText(R.string.four); break; } 

Вот официальный учебник, объясняющий, когда и когда не использовать break; ,

Вам нужно break; После каждой ветки:

 switch (position) { case 0: textView.setText(R.string.zero); break; // <-- here // etc } 

Легитимное использование switch когда вы его не break , называются провалами; Или потому, что вы return или throw .:

 switch (someNumber) { case 0: return 0; // no need for break here case 1: throw new IllegalArgumentException(); // no need to break here case 2: System.out.println("Oh, I got two!"); // fall through case 3: return 3; default: System.out.println("Meh") // No need to break: last possible branch } return -1; 

Вернется 3, даже если вы введете 2.

Но в противном случае вам нужно break .

Использование инструкции break после каждого случая должно устранить проблему. Я бы также использовал инструкцию по умолчанию, а также после последнего случая.

Это решение. Вам нужно использовать break чтобы избежать прохождения каждого случая:

 switch(position) case 0: textView.setText(R.string.zero); break; case 1: textView.setText(R.string.one); break; case 2: textView.setText(R.string.two); break; case 3: textView.setText(R.string.three); break; case 4: textView.setText(R.string.four); break; 

Я бы рекомендовал прочитать документацию о оракуле о инструкции switch .

Вам нужно использовать оператор break после операций с eace case. В операторе switch-case, если вы не используете оператор break, тогда будут выполняться все случаи после этого конкретного

 case 0: textView.setText(R.string.zero); break; 

Не забудьте поставить break; После каждого случая: вот так:

 switch(position){ case 0: textView.setText(R.string.zero); break; case 1: textView.setText(R.string.one); break; case 2: textView.setText(R.string.two); break; case 3: textView.setText(R.string.three); break; case 4: textView.setText(R.string.four); break; } 

В операторах Switch-case вам нужно поставить break; После каждого случая .

 switch(position){ case 0: textView.setText(R.string.zero); break; case 1: textView.setText(R.string.one); break; case 2: textView.setText(R.string.two); break; case 3: textView.setText(R.string.three); break; case 4: textView.setText(R.string.four); break; default: System.out.println("not available"); } 

Также вам нужно поставить default: наконец, потому что, когда все случаи ошибочны, время выполнения default: action.

В операторе switch-case не забывают про break; И действие по умолчанию.

Каждый оператор break завершает заключенный оператор switch. Поток управления продолжается с первым оператором, следующим за блоком коммутатора. Операторы break необходимы, потому что без них утверждения в блоках коммутатора проваливаются: все инструкции после метки соответствия выполняются в последовательности, независимо от выражения последующих меток case, до тех пор, пока не будет встречен оператор break.

Переключатель быстрее, чем оператор if-else

Нижняя строка: по умолчанию является необязательным (работает как оператор else в коммутаторе), Break является обязательным.

Интересный факт: вы не увидите никакой ошибки компиляции, даже если вы забыли разместить оператор break.

В каждом случае switch нуждается в break . Но в вашем случае это можно сделать намного проще, указав массив, как показано ниже.

 String values = {R.string.zero, R.string.one, R.string.two, ... }; 

Используйте это для заполнения textView: textView.setText(values[position]);