2010-11-12 42 views
15

Estoy intentando llamar a startActivity (myIntent) desde el clic de un botón de menú, pero mi aplicación falla en ese punto.Cómo llamar a la actividad desde un elemento del menú en Android?

La misma llamada de startActivity funciona bien desde un clic de botón normal, entonces, supongo que al botón de menú le falta información sobre el contexto? O tal vez estoy totalmente fuera de lugar aquí.

Entonces ... ¿cuál es la forma correcta de tener un elemento de menú llevarme a una actividad específica?

He revisado mi código según el conjunto inicial de consejos. Todavía chocando en el mismo lugar. El depurador no ingresa la cláusula de excepción, la aplicación simplemente muere.

[editar con los fragmentos de código]

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    try{ 
    switch (item.getItemId()) { 
    case R.id.menuItemLang:    
     startActivity(new Intent("com.my.project.SETTINGS")); 
     return true;   
    default: 
     return super.onOptionsItemSelected(item); 
    } 
    }catch(Exception e){ 
     log(e); 
    } 
} 
+1

Publica el stacktr completo as desde tu caída, y el fragmento de código de cómo estás comenzando la Actividad. –

+0

Necesitará publicar su código y su seguimiento de pila – Falmarri

+0

debe usar logcat para ver el seguimiento de la pila. Si está utilizando eclipse, puede cambiar a la perspectiva de DDDS o abrir la vista de logcat. De lo contrario, ejecute adb logcat desde la línea de comando. –

Respuesta

43

La primera opción

Tiene que reemplazar onOptionsItemSelected método en su actividad, lo que se llama cuando el usuario hace clic en el elemento de menú Opciones. En el método puede verificar en qué elemento se ha hecho clic.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
    case R.id.menu_item1: 
     Intent intent = new Intent(this, ActivityForItemOne.class); 
     this.startActivity(intent); 
     break; 
    case R.id.menu_item2: 
     // another startActivity, this is for item with id "menu_item2" 
     break; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 

    return true; 
} 

También hay onContextItemSelected método que funciona similary, pero para el menú de contexto (no estoy seguro, lo que quiere decir de menú).

Más información en http://developer.android.com/guide/topics/ui/menus.html

EDIT:

La segunda opción

Creo que la primera opción es más fácil, pero a partir de su código veo, que desea iniciar la actividad como una acción (debido al parámetro String en Intent constructor). Para hacer esto, debe especificar una acción en su AndroidManifest.xml. Por lo tanto, si iba a comenzar la actividad ActivityForItemOne (del ejemplo anterior) el elemento <application> en AndroidManifest.xml se vería así:

<application ...> 
    ... 

    <activity android:label="Activity For First Item" android:name=".ActivityForItemOne"> 
     <intent-filter> 
      <action android:name="my.app.ITEMONE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 

Y el Intent será:

Intent intent = new Intent("my.app.ITEMONE"); 

El my.app. es el paquete de su aplicación. No es necesario utilizar el paquete de la aplicación, pero se recomienda para la singularidad de las acciones.

Más información en:

Class Intent - Action and Category constants

Action element

Intents and Intent Filters

esperanza esta a resolver su problema.

+0

EDITAR: Segunda opción, iniciar actividad por nombre de acción. – branoholy

1

Más Optimice:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.item1: 
      return true; 
     case R.id.item2: 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
0

si ha Clase 2 1 MainActivity 2 Bienvenido entonces usted necesita para pasar de Welcom> MainActivity

@ Override booleano onCreateOptionsMenu (menú Menú) pública {

return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case R.id.logout: 
      Intent intent = new Intent(this, MainActivity.class); 
      this.startActivity(intent); 
      break; 
     case R.id.settings: 
      // another startActivity, this is for item with id "menu_item2" 
      break; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 

    return true; 
} 
Cuestiones relacionadas