在Android中所有活动中使用相同的选项菜单

37

我的项目中有10-15个活动。我希望在大多数活动中都有选项菜单。那么,有没有一种方法可以在一个地方完成这个任务,并使其在所有活动中显示?

此外,我想在某些活动中隐藏选项菜单。那么,这是否可能,还是我必须在所有活动中编写选项菜单代码?

敬礼

Sunil


1
st0le的答案完美地解决了问题。我的唯一建议是,在那些你不想要菜单的活动中,不要继承BaseActivity类,而是直接继承Activity类。这样你就不必重写与菜单相关的方法了。 - Yorgos Lamprakis
3个回答

71
创建一个类(比如叫做 BaseActivity)继承自 Activity,并重写 onCreateOptionsMenuonOptionsItemSelected 函数。
public class BaseActivity extends Activity {

    // Activity code here

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item:
                // do what you want here
                return true;
            default:
               return super.onOptionsItemSelected(item);
        }
    }
}

现在,在其他15-16个活动中,您应该扩展 BaseActivity,而不是扩展一个Activity。

public class FooActivity extends BaseActivity { 

    // Activity code here

}

这样,您所有的活动都会派生出选项菜单。对于您想要禁用选项菜单的活动,您可以在该特定活动中再次覆盖它。

public class BarActivity extends BaseActivity { 

    // Activity code here

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
       // Do Nothing
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       // Do Nothing
   }
}

希望它不会在清单文件中给你带来问题。


我也考虑过这个问题,但我已经有一个自定义活动来设置所有活动的标题栏。我会尝试在那里实现它。 - sunil
是的,请这样做,它应该可以工作。同时报告您的结果。 :) - st0le
对我来说没问题!尽管只能扩展一个类的限制确实存在。 - publicknowledge
BaseMenu是一个类还是一个活动? - Ruchir Baronia
@RuchirBaronia 这是一个扩展了Activity类的类,也就是说它本身也是一个Activity。 - Shailendra Madda
显示剩余3条评论

3
这个问题的解决方案是在您的新活动中添加此菜单方法。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_home_page, menu);
    menu.removeItem(R.id.logout);
    return true;
}

在每个活动中,此方法会自动出现。
如果没有出现,则使用inflate调用添加它。它需要两个参数:XML资源(与您在原始活动中使用的相同),以及传递到onCreateOptionsMenu方法中的菜单对象。 menu.removeItem将删除您传递给它的任何资源ID的菜单项。希望这可以帮助那些面临此问题的人。
谢谢,并很高兴分享这篇文章。

1

仅仅扩展BaseActivity是不够的,你还必须在其他活动中像这样调用super.onCreateOptionsMenu(menu)super.onOptionsItemSelected(item)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    //getMenuInflater().inflate(R.menu.menu_second, menu);  <- remove this
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

getMenuInflater().inflate(R.menu.menu_second, menu); //<-你应该删除这个 - Ruchir Baronia
这会使选项菜单消失吗? - Ruchir Baronia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接