2010-11-12 3 views
15

Я пытаюсь вызвать startActivity (myIntent) с помощью нажатия кнопки меню, но мое приложение вылетает в этот момент.Как вызвать Activity из пункта меню в Android?

Тот же самый вызов startActivity отлично работает от обычного нажатия кнопки, поэтому я предполагаю, что на кнопке меню отсутствует информация о контексте? Или, может быть, я совершенно не знаком с этим.

Итак ... Каков правильный способ иметь пункт меню для перехода к определенному заданию?

Я пересмотрел свой код на основе первоначального набора советов. Все еще рушится в одном и том же месте. Отладчик не вводит условие исключения, приложение просто умирает.

[РЕДАКТИРОВАНИЕ С фрагмент кода]

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

Просим выслать полный stacktr туз из вашего сбоя и фрагмент кода о том, как вы начинаете действие. –

+0

Вам нужно будет опубликовать свой код и трассировку стека – Falmarri

+0

, чтобы просмотреть трассировку стека, вы должны использовать logcat. Если вы используете eclipse, вы можете переключиться на перспективу DDDS или открыть представление logcat. В противном случае запустите adb logcat из командной строки. –

ответ

43

Первый вариант

Вы должны переопределить onOptionsItemSelected метод в деятельности, которая вызывается, когда пользователь нажимает на пункт в меню Options. В методе вы можете проверить, какой элемент был нажат.

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

Существует также onContextItemSelected метод, который работает точно также, но в контекстном меню (я не уверен, какое меню вы имеете в виду).

Более подробная информация на http://developer.android.com/guide/topics/ui/menus.html

EDIT:

Второй вариант

Я думаю, что первый вариант проще, но из вашего кода я вижу, что вы хотите, чтобы начать деятельность в качестве действие (из-за параметра String в конструкторе Intent). Для этого вам нужно указать действие в вашем AndroidManifest.xml. Так что, если я хотел бы начать деятельность ActivityForItemOne (из предыдущего примера), <application> элемент AndroidManifest.xml будет выглядеть следующим образом:

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

И Intent будет:

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

my.app. является пакет ваше приложение. Нет необходимости использовать ваш пакет приложений, но рекомендуется для уникальности действий.

Дополнительной информация:

Class Intent - Action and Category constants

Action element

Intents and Intent Filters

Надеется, что это решит вашу проблему.

+0

EDIT: второй вариант, начиная деятельность по имени действия. – branoholy

1

Больше 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

если Там есть 2 класса 1 MainActivity 2 Добро пожаловать , то вам нужно перейти от Welcom> MainActivity

@Override onCreateOptionsMenu (меню Menu) общественное булево {

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; 
} 
Смежные вопросы