![]() |
|
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
||||
|
||||
|
como Insertar dos case?
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? Última edición por david.te Día 22/08/11 a las 23:28:15 |
|
|
|
#2
|
|
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. |
|
#3
|
|
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.
|
|
#4
|
||||
|
||||
|
Cita:
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? |
|
#5
|
|
|
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:
Código:
case 0: ... case 0: ... 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. Cita:
Aunque soy también novato en Android y Java nunca me ha "caido bien", espero poder ayudarte. |
|
#6
|
||||
|
||||
|
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 |
|
#7
|
||||
|
||||
|
@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... ![]() Un saludo. |
|
#8
|
||||
|
||||
|
Cita:
He peusto el codigo, haber si podeis echarle un ojo :SGracias. |
|
#9
|
||
|
Cita:
Si fueras el único... yo ando también de ese color, jejeje. Además, Java es un lenguaje muy "tiquismiquis" el muy jod***. Cita:
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, Código:
case 0: retorno=true; break; case 1: retorno=false; break; default: retorno=false; ... return retorno;
Última edición por iliberis Día 22/08/11 a las 23:57:16 Razón: Ampliar informacion |
|
#10
|
||||
|
||||
|
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(); } }); } } |
|
#11
|
||
|
Cita:
Cita:
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. 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. |
|
#12
|
||||
|
||||
|
Gracias a todos
decidí coger otro camino.Pero ahora he aprendido un poco más gracias a vosotros
|
|
#13
|
|
Muchas veces esa es una de las mejores soluciones, jejeje.
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. |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 02:01:57 (GMT +1)
HTCMania: líderes desde el 2007







