Ver la Versión Completa : como Insertar dos case?
david.te
22/08/11, 21:17:57
Hola, estoy empesando en esto, y me ha surgido un problema,. es el siguiente:
override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID:
createNote();
return true;
case ERASE_ID:
eraseNote();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
Me salta error, creo que es una barbaridad lo que he echo,
Como puedo poner esos dos case?
iliberis
22/08/11, 23:18:37
Lo primero y más importante: De los miles de errores posibles que puede dar Java, ¿cuál te aparece a ti? La descripción del error puede proporcionar información muy útil para resolverlo.
Otra cosa que veo, es que no está muy bien construida la estructura. No es que esté mal, pero los bloques de un switch se suelen "romper" con una sentencia break. De lo contrario, cuando valga INSERT_ID, se van a ejecutar LOS DOS bloques de instrucciones, tanto el INSERT como el ERASE. A continuación de los dos return true debes poner "break;" si no quieres que se produzca ese efecto. Por otro lado, ¿no hacen lo mismo los dos bloques de codigo? ¿El primer eraseNote no debiera ser insertNote o algo similar?
Pon la salida del compilador y le echamos un vistazo entre todos al error. A ver si conseguimos arreglarlo, que no debe ser nada excesivamente complicado.
iliberis
22/08/11, 23:22:42
Por cierto, importantisimo, el ultimo return creo que puede estar inhabilitando los anteriores (que alguien me corrija, que no soy precisamente un maestro en Java). Si debe retornar true en esos dos casos, y en todos los demás super.onMenuItemSelected..., lo pondría en un bloque "default" dentro del switch.
En resumen, mejor si vemos el error completo. :-)
david.te
22/08/11, 23:27:23
Lo primero y más importante: De los miles de errores posibles que puede dar Java, ¿cuál te aparece a ti? La descripción del error puede proporcionar información muy útil para resolverlo.
Otra cosa que veo, es que no está muy bien construida la estructura. No es que esté mal, pero los bloques de un switch se suelen "romper" con una sentencia break. De lo contrario, cuando valga INSERT_ID, se van a ejecutar LOS DOS bloques de instrucciones, tanto el INSERT como el ERASE. A continuación de los dos return true debes poner "break;" si no quieres que se produzca ese efecto. Por otro lado, ¿no hacen lo mismo los dos bloques de codigo? ¿El primer eraseNote no debiera ser insertNote o algo similar?
Pon la salida del compilador y le echamos un vistazo entre todos al error. A ver si conseguimos arreglarlo, que no debe ser nada excesivamente complicado.
Gracias por responder.
El código correcto, ya arreglado el eraseNote(); en los dos.
override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID :
createNote();
return true;
case ERASE_ID:
eraseNote();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
y el error que me marca es Duplicate case
y lo siento, soy nuevo en esto, pero ¿como saco la salida del compilador?
iliberis
22/08/11, 23:40:30
y el error que me marca es Duplicate case
El fallo es, normalmente, que las constantes INSERT_ID Y ERASE_ID valen lo mismo. Es decir, prescindiendo de las constantes, usando valores literales, tendriamos algo asi:
case 0:
...
case 0:
...
Y, claro, el compilador se lía al ver dos bloques diferentes para el mismo valor.
La cuestión es por qué valen lo mismo las dos constantes. Debieran estar definidas al principio de la clase. Mira sus valores, no sea que estén iguales. Si no, aunque sea menos "elegante", puedes poner los valores literales en los case en lugar de las constantes. Seguro que asi ya no da ese molesto error.
y lo siento, soy nuevo en esto, pero ¿como saco la salida del compilador?
A mi con el error ya me aclara algo. Para sacar la salida del compilador ya depende del IDE que uses. Lo normal es, en la consola, copiar y pegar la parte interesante, porque toda la salida será bien larga.
Aunque soy también novato en Android y Java nunca me ha "caido bien", espero poder ayudarte.
david.te
22/08/11, 23:45:40
Pongo el código entero.
public class Notepadv3 extends ListActivity {
private static final int ACTIVITY_CREATE = 0;
private static final int ACTIVITY_ERASE = 1;
private static final int ACTIVITY_EDIT = 2;
private static final int INSERT_ID = Menu.FIRST;
private static final int ERASE_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;
private NotesDbAdapter mDbHelper;
/** Called when the activity is first created. */
override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FL AG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.notes_list);
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
fillData();
registerForContextMenu(getListView());
}
private void fillData() {
Cursor notesCursor = mDbHelper.fetchAllNotes();
startManagingCursor(notesCursor);
//
String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
//
int[] to = new int[] { R.id.text1 };
//
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.notes_row, notesCursor, from, to);
setListAdapter(notes);
}
override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, INSERT_ID, 0, R.string.menu_insert);
menu.add(0, ERASE_ID, 0, R.string.EliminarBD);
return true;
}
override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID:
createNote();
return true;
break;
case ERASE_ID:
eraseNote();
return true;
break;
}
return super.onMenuItemSelected(featureId, item);
}
override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}
override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
mDbHelper.deleteNote(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
private void createNote() {
Intent i = new Intent(this, NoteEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);
}
private void eraseNote() {
Intent i = new Intent(this, delete.class);
startActivityForResult(i, ACTIVITY_ERASE);
}
override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
startActivityForResult(i, ACTIVITY_EDIT);
}
override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
fillData();
}
}
La verdad es que estoy muy verde :S
Arasthel
22/08/11, 23:46:02
david.te por lo que tengo entendido y por mi pésima programación cuando empezaba en Java, recordarte lo que ya te dijo el compañero iliberis: usar un switch y no usar break en cada caso es como ir encendiendo luces una a una en una casa y esperar que luego sólo esté una encendida. Un case, si no me equivoco, se ejecuta desde su inicio hasta encontrar un break, así que si no encuentra, sigue p'alante, ejecutando toda la parte del switch que quede debajo del caso activo.
En cuanto a lo del return, un método sólo usa un return, y será el primero que encuentre en su ejecución.
De todas formas, esto lo digo desde mi corta experiencia y mala memoria, así que... xD
Un saludo.
david.te
22/08/11, 23:55:54
david.te por lo que tengo entendido y por mi pésima programación cuando empezaba en Java, recordarte lo que ya te dijo el compañero iliberis: usar un switch y no usar break en cada caso es como ir encendiendo luces una a una en una casa y esperar que luego sólo esté una encendida. Un case, si no me equivoco, se ejecuta desde su inicio hasta encontrar un break, así que si no encuentra, sigue p'alante, ejecutando toda la parte del switch que quede debajo del caso activo.
En cuanto a lo del return, un método sólo usa un return, y será el primero que encuentre en su ejecución.
De todas formas, esto lo digo desde mi corta experiencia y mala memoria, así que... xD
Un saludo.
Al añadir el break sigue el error "duplciate case"
He peusto el codigo, haber si podeis echarle un ojo :-) :S
Gracias.
iliberis
22/08/11, 23:56:10
private static final int INSERT_ID = Menu.FIRST;
private static final int ERASE_ID = Menu.FIRST;
Aquí lo tienes. Las dos constantes valen igual. Casi seguro ese es el fallo.
La verdad es que estoy muy verde :S
Si fueras el único... yo ando también de ese color, jejeje. Además, Java es un lenguaje muy "tiquismiquis" el muy jod***.
david.te por lo que tengo entendido y por mi pésima programación cuando empezaba en Java, recordarte lo que ya te dijo el compañero iliberis: usar un switch y no usar break en cada caso es como ir encendiendo luces una a una en una casa y esperar que luego sólo esté una encendida. Un case, si no me equivoco, se ejecuta desde su inicio hasta encontrar un break, así que si no encuentra, sigue p'alante, ejecutando toda la parte del switch que quede debajo del caso activo.
En cuanto a lo del return, un método sólo usa un return, y será el primero que encuentre en su ejecución.
Normalmente el tema del break es justamente así. Pero es normal poner los return "en medio" (MUY poco elegante), con lo que ya se produce la ruptura que evita que se ejecute el resto del código. A mi me parece poco elegante, tanto poner más de un return como no poner break, pero parece que es práctica común. Aunque acostumbrarse a esta forma de trabajo puede conducir a adoptar costumbres que luego llevan a errores. El día que no haya return en el bloque, aparece un error inexplicable cuando se ejecuta todo. No es necesario, pero yo lo pondría "bonito" por si acaso.
Lo que yo suelo hacer con los return es poner una variable que adopte el valor que se debe devolver y luego, al final, retornar ese valor. Es decir,
case 0:
retorno=true;
break;
case 1:
retorno=false;
break;
default:
retorno=false;
...
return retorno;
Pero, vamos, esto ya es cuestión de gustos. :-)
david.te
23/08/11, 00:12:08
Gracias a todos los que habéis respondido
Funciono, al menos ya no me salta error.
El fallo esta al ejecutarlo en el móvil, el ERASE_ID, segun tenia en la cabeza, deberia abrir la classe delete, y ejecutarlo en el movil pero se bloquea.
esto esta en delete.java
Lo siento si es mucho pedir, pero llevo días intentando que funcione :S
el código es el siguiente:
public class delete extends Activity {
private Button botonEliminarBD;
private static final String nombreBD = "data";
override
public void onCreate(Bundle savedInstanceState) {
//
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
botonEliminarBD = (Button) findViewById(R.id.btEliminarBD);
//
botonEliminarBD.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
delete.this);
alertDialog
.setMessage("¿Desea eliminar la base de datos por completo?");
alertDialog.setTitle("Eliminar agenda...");
alertDialog.setIcon(android.R.drawable.ic_dialog_a lert);
alertDialog.setCancelable(false);
alertDialog.setPositiveButton("Sí",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
try {
Toast.makeText(
getApplicationContext(),
"Eliminando base de datos: "
+ nombreBD,
Toast.LENGTH_LONG).show();
boolean resultado = deleteDatabase(nombreBD);
if (resultado)
Toast.makeText(
getApplicationContext(),
"Base de datos eliminada correctamente",
Toast.LENGTH_LONG).show();
else
Toast.makeText(
getApplicationContext(),
"No se ha podido eliminar la base de datos",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(
getApplicationContext(),
"No se ha podido eliminar la base de datos",
Toast.LENGTH_LONG).show();
}
}
});
alertDialog.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
Toast.makeText(
getApplicationContext(),
"Eliminación de base de datos cancelada",
Toast.LENGTH_LONG).show();
}
});
alertDialog.show();
}
});
}
}
iliberis
23/08/11, 00:54:25
Gracias a todos los que habéis respondido
Funciono, al menos ya no me salta error.
Estupendo. Un fallo resuelto. Si tenía que ser una tontería, como casi siempre. Me alegro que la cosa ya funcione.
El fallo esta al ejecutarlo en el móvil, el ERASE_ID, segun tenia en la cabeza, deberia abrir la classe delete, y ejecutarlo en el movil pero se bloquea.
esto esta en delete.java
Esto ya es más complicado. Al no haber "errores" se puede presuponer que el código está bien. Pero, claro, lo mismo se está ejecutando algo que, sin llegar a provocar excepción, está haciendo algo mal. Podría ser un bucle infinito o algo similar. A ver si algún alma caritativa nos ilumina con este tema y nos da unas pistas. Yo, sin conocer el programa en profundidad, poco voy a poder hacer. No obstante echaré un vistazo más despacio al código, a ver qué veo.
Lo que si te aconsejo es que lo depures "a la vieja usanza". Es decir, pon una etiqueta o un alert en la pantalla y ve colocando algo en ella a cada paso importante que de el programa. De esta forma, sabrás al menos si llega a ejecutar la clase, y hasta donde llega. En otras palabras, podrás aislar el fragmento de código donde se está provocando el fallo. Asi al menos tendrás más pistas.
Lo siento si es mucho pedir, pero llevo días intentando que funcione :S
Para eso entramos en un foro, unas veces para pedir y otras para ayudar. La próxima vez algún usuario me ayudará a mi cuando lo necesite, jejeje.
david.te
23/08/11, 02:20:06
Gracias a todos :) decidí coger otro camino.
Pero ahora he aprendido un poco más gracias a vosotros :)
iliberis
23/08/11, 03:03:56
Gracias a todos :) decidí coger otro camino.
Muchas veces esa es una de las mejores soluciones, jejeje.
Pero ahora he aprendido un poco más gracias a vosotros :)
Pues eso es lo importante. Todos los días un poco más hasta manejarlo como si hubieramos nacido con esos conocimientos.
Espero que te vaya bien con ese proyecto y que pronto te tengamos por aqui presumiendo del programa y enseñándonos cómo te ha quedado.
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.