代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

如何在Android中从菜单项调用活动?

  •  15
  • Yevgeny Simkin  · 技术社区  · 14 年前

    我正试图通过单击菜单按钮来调用startActivity(myIntent),但我的应用程序在这一点上崩溃了。

    同一个startActivity调用通过一个常规的按钮点击可以正常工作,所以,我假设menu按钮缺少关于上下文的信息?或者我完全不符合标准。

    所以。。。菜单项带我去某个特定活动的正确方式是什么?

    我已经根据最初的建议修改了代码。仍然在同一个地方坠毁。调试器没有输入exception子句,应用程序就死掉了。

    [用代码片段编辑]

    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 回复  |  直到 14 年前
        1
  •  45
  •   branoholy    14 年前

    第一选择

    你必须超越 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 (从上一个示例) <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 = new Intent("my.app.ITEMONE");
    

    这个 my.app. 是您的应用程序包。不必使用应用程序包,但建议使用它来实现操作的唯一性。

    更多信息请访问:

    Class Intent - Action and Category constants

    Action element

    Intents and Intent Filters

    希望这能解决你的问题。

        2
  •  1
  •   Codelaby    8 年前

    更多优化:

    @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);
        }
    }
    
        3
  •  0
  •   Habeeb Rahman kalathil    8 年前

    如果有两个班 1主要活动 2欢迎 那你就得离开 welcom>主要活动

    @覆盖 public boolean oncreateoptions菜单(菜单菜单){

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