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

时间:2010-11-12 22:39:39

标签: 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);
   }
}

3 个答案:

答案 0 :(得分:44)

第一个选项

您必须覆盖Activity中的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

的更多信息

修改

第二个选项

我认为第一个选项更容易,但是从我看到的代码中,您希望将活动作为操作启动(因为String构造函数中的Intent参数)。为此,您需要在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

希望这可以解决您的问题。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

如果有2个班级 1 MainActivity 2欢迎 那你需要离开 WELCOM&GT; MainActivity

@覆盖     public boolean 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;
}