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:
- Diferenciar los diálogos individuales con DialogInterface.OnClickListener
- Ocultar texto predeterminado para el botón de Android
- Widget de conmutador vertical Android
- Para eventos de Android, ¿por qué las sentencias switch son más comunes que if-else?
- Cómo cambiar la altura y el ancho de Switch en Android
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?
- Cómo cambiar el color de entrada del imput en xml?
- ¿Por qué utilizar un hashmap?
- Android Cambiar entre actividades
- ¿Cómo puedo agregar tercer estado en Android Switch?
- El texto de Android debe aparecer en ambos lados en el
- Cómo cambiar entre actividades con viewflipper
- Obtener la intensidad de la señal de WIFI y datos móviles
- Problema de conmutación: solo una opción visible
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]);