重复使用选项菜单代码

6
有没有一种方便的方法在多个Activity中显示相同的选项菜单选项?
例如:在我的应用程序中,我以三种方式之一显示电视节目指南。
- 七天指南(带有7个标签的TabActivity) - 所有频道“现在正在播放”(ListActivity) - 按开始时间列出今天所有展示内容(Activity - 可轻松更改为ListActivity)
对于TabActivity中的Options菜单,代码非常简单...
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    menu.clear();
    inflater.inflate(R.menu.gv_options_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.view:
        ...
    ...
    }
}

...但目前看来,我需要将其复制/粘贴到其他两个活动中,这不是我喜欢做的。如果我更改一个选项菜单代码,那么我也需要为另外两个活动进行更改。

我能想到的唯一替代方案是拥有一个“帮助器”类(POJO),我可以向其中添加一个方法并将context传递进去,以允许使用getMenuInflator()方法和另一个方法,我可以将item.getItemId()的结果传递进去以与switch-case处理。

有多个具有相同选项菜单的活动的正常方式是什么?

3个回答

10
创建一个简单的独立类,该类包含以下两个方法:
public class MyMenuHandler {

    private Activity mActivity;

    public MyMenuHandler(Activity activity) {
        mActivity = activity;
    }

    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuInflater inflater = mActivity.getMenuInflater();
        menu.clear();
        inflater.inflate(R.menu.gv_options_menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.view:
            ...
        }
    }
}

在你的活动中,重写那些回调方法并将调用重定向到你的 MyMenuHandler 类的实例:

public class MyActivity1 extends TabActivity {

    private MyMenuHandler mMenuHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        mMenuHandler = new MyMenuHandler(this);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // you may also add here some items which are specific 
        // for one activity, not for the others
        ...
        return mMenuHandler.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle selection of your specific items here,
        // if none of them has been selected call mMenuHandler method
        ...
        return mMenuHandler.onOptionsItemSelected(item);
    }
}
这将让你在一个地方维护响应基本菜单项选择的代码,因此无需担心将其复制粘贴到所有需要相同菜单的活动中。

5
一种方法是在Activity中使用继承。创建一个实现选项菜单方法的基类Activity,然后每个子Activity都会获得该功能。这是Android开发者网站上推荐的方法
提示:如果您的应用程序包含多个活动并且其中一些提供相同的选项菜单,请考虑创建一个只实现onCreateOptionsMenu()和onOptionsItemSelected()方法的活动。然后为应该共享相同选项菜单的每个活动扩展此类。这样,您只需要管理一个处理菜单操作的代码集,并且每个派生类都继承了菜单行为。
不幸的是,由于您没有从Activity本身继承,而是从不同的子类中继承,因此这种方法对您不起作用,但这是“正常”的做法。

事实证明,我忘记了7天指南活动选项卡内容实际上是ListActivitys - 我已经将“所有节目今天...”活动(我的问题中的第3个)更改为ListActivity,并定义了一个基类,现在所有三个都扩展该基类。这是那些看不到森林的树的时刻。谢谢。 - Squonk

2
您可以将操作菜单封装在片段中。这样,您只需要在活动的onCreate菜单中添加该片段即可。
一旦创建了片段,您需要调用setHasOptionsMenu
要添加添加片段,请使用标记而不是布局ID。

你好。你有没有关于这个的好例子(教程或任何示例)?Fragment对我来说还很新。 - xDragonZ
请从这里开始阅读:http://developer.android.com/guide/topics/fundamentals/fragments.html - Janusz
请注意,此内容仅适用于使用API级别11或更高级别的情况。 - a.ch.
1
或者使用谷歌提供的兼容性包。由于几乎所有支持4.0和2.2的应用程序都将使用这个库,因此这不应该是一个问题。 - Janusz
不知道这个,谢谢。以防万一有人需要:Android支持包 - a.ch.

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