2010-11-12 40 views
15

我试图从点击菜单按钮调用startActivity(myIntent),但是我的应用程序在那一刻崩溃了。如何从Android中的菜单项调用活动?

相同的startActivity调用从正常按钮单击工作正常,所以,我假设菜单按钮缺少有关上下文的信息?或者,也许我完全不在这里。

所以...有一个菜单项带我到一个特定的活动正确的方法是什么?

我已经根据最初的建议集修改了我的代码。仍然在同一个地方崩溃。调试器不会输入异常条款,应用程序就会死亡。

[WITH代码片段EDITED]

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来自你的崩溃的ace,以及你如何启动Activity的代码片段。 – 2010-11-12 22:42:04

+0

您需要发布代码和堆栈跟踪 – Falmarri 2010-11-12 22:44:10

+0

您应该使用logcat来查看堆栈跟踪。如果您使用的是eclipse,则可以切换到DDDS透视图,或者打开logcat视图。否则,从命令行运行adb logcat。 – 2010-11-13 16:43:12

回答

43

第一选项

你必须重写onOptionsItemSelected方法在你的活动,当用户单击选项菜单中的项目被调用。在该方法中,您可以检查点击了哪个项目。

@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

编辑:

第二个选项

我觉得第一个选项是比较容易,但是从你的代码,我明白了,你要开始活动的一个动作(因为Intent构造函数中的参数String)。为此,您需要在AndroidManifest.xml中指定一个操作。所以,如果我要开始活动ActivityForItemOne(从前面的例子)在AndroidManifest.xml中<application>元素应该是这样的:

<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

编辑:第二个选项,按行动名称开始活动。 – branoholy 2010-11-15 16:21:56

1

更多工艺优化:

@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欢迎 那么你需要从 开山鼻祖> MainActivity

@覆盖 公共布尔onCreateOptionsMenu(菜单菜单)去{

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; 
} 
相关问题