If-else trabajando, no cambie

Estoy haciendo una aplicación que tiene una cuadrícula de imágenes con texto y cada uno abre una actividad diferente. Funciona bien, pero sólo con fines de diseño Quiero reemplazar mis if-else statements con switch statements (que supongo que puedo hacer) sin embargo, no funciona. En este momento mi código de trabajo para establecer la etiqueta en cada imagen es:

 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.... 

Quiero usar:

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

Pero cuando hice ese sello era el último que definí (en mi ejemplo sería "cuatro"). También tengo un código similar para cada objeto para iniciar una intent diferente con la variable de position sin embargo que hace lo contrario y hace que cada intento igual a la primera. ¿Es incorrecta mi sintaxis o esto no funcionará para mi situación?

Necesitas break; Después de cada declaración en un case , de lo contrario la ejecución fluye hacia abajo (todos los casos por debajo de la que desea también se llamará), por lo que siempre obtendrá el último caso.

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

Aquí está el tutorial oficial que explica cuándo y cuándo no usar break; .

Necesitas break; Después de cada rama:

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

Los usos legítimos del switch cuando usted no break existen, ésos se llaman throughs del otoño; O porque return o 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; 

Devolverá 3 incluso si ingresa 2.

Pero de lo contrario tiene que break .

Utilizar una instrucción break después de cada caso debe solucionar el problema. También usaría una declaración por defecto también después del último caso.

Esta es la solución. Necesita usar break para evitar pasar por cada caso:

 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; 

Yo recomendaría leer la documentación de Oracle sobre la instrucción switch .

Necesita usar break statement después de las operaciones de caso de eace. En una sentencia switch-case si no usas una sentencia break, entonces todos los casos después de ese específico serán ejecutados también

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

No te olvides de poner break; Después de cada caso: así:

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

En las sentencias Switch-case , es necesario poner break; Después de cada caso .

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

También hay que poner por defecto: al fin, porque cuando todos los casos están equivocados que el tiempo realice por defecto: acción.

En la sentencia switch-case no se olvidó de break; Y la acción predeterminada.

Cada instrucción break cierra la instrucción switch de inclusión. El flujo de control continúa con la primera instrucción después del bloque de interruptores. Las sentencias de interrupción son necesarias porque sin ellas, las sentencias en los bloques de conmutación caen: Todas las sentencias después de la etiqueta de caso coincidente se ejecutan en secuencia, independientemente de la expresión de las etiquetas de caso subsiguientes, hasta que se encuentre una sentencia break.

El conmutador es más rápido que if-else

Bottom line: El valor predeterminado es opcional (funciona como la sentencia else en el switch), Break es obligatorio.

Dato interesante: no verás ningún error de compilación, incluso si olvidaste de colocar la sentencia break.

El switch necesita una break en cada caso. Pero en su caso, podría hacerse mucho más simple mediante la definición de una matriz como se muestra a continuación.

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

Use esto para llenar textView: textView.setText(values[position]);

  • Cómo agregar un escucha a un botón de conmutación?
  • Un problema Java de conmutación: las expresiones de caso deben ser expresiones constantes
  • Actividad del conmutador androide de un hilo no ui
  • Menú emergente personalizado de Android con conmutador
  • Android: El botón OnClickListener no funciona
  • Switch case statement error: las expresiones case deben ser constantes
  • Android Studio no me deja usar el interruptor en una cadena?
  • Android: cambia a la actividad sin reiniciarla
  • Cobertura de Jacoco para la declaración de switch
  • ¿Puede utilizar declaraciones condicionales en el caso de conmutación en Android?
  • Cómo cambiar entre la cámara delantera y trasera cuando se utiliza MediaRecorder android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.