如何从Android中的菜单项调用Activity?

Gen*_* S. 15 android

我试图通过单击菜单按钮调用startActivity(myIntent),但我的应用程序在此时崩溃.

从常规按钮单击开始,相同的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);
   }
}
Run Code Online (Sandbox Code Playgroud)

bra*_*oly 45

第一种选择

您必须覆盖onOptionsItemSelectedActivity中的方法,该方法在用户单击"选项"菜单中的项目时调用.在该方法中,您可以检查已单击的项目.

@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;
}
Run Code Online (Sandbox Code Playgroud)

也有onContextItemSelected类似的方法,但对于上下文菜单(我不确定,你的意思是什么菜单).

有关更多信息,请访问http://developer.android.com/guide/topics/ui/menus.html

编辑:

第二种选择

我认为第一个选项更容易,但是从我看到的代码中,您希望将活动作为一个动作启动(因为构造函数中的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>
Run Code Online (Sandbox Code Playgroud)

而且Intent将是:

Intent intent = new Intent("my.app.ITEMONE");
Run Code Online (Sandbox Code Playgroud)

my.app.是您的应用程序包.没有必要使用您的应用程序包,但建议采用独特的操作.

更多信息:

类意图 - 动作和类别常量

行动要素

意图和意图过滤器

希望这能解决你的问题.