6

有没有一种方便的方法可以在多个活动中显示相同的选项菜单选项?

示例:在我的应用程序中,我以三种方式之一显示电视指南。

  1. 七日指南(带有 7 个选项卡的 TabActivity)
  2. 所有频道“正在播放”(ListActivity)
  3. 今天所有节目的开始时间(活动 - 可以轻松更改为 ListActivity)

对于 中的选项菜单TabActivity,代码非常简单...

@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()给使用开关进行处理-案子。

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

4

3 回答 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);
    }
}

这将使您将响应基本菜单项选择的代码保存在一个地方,因此无需担心将其复制粘贴到具有相同菜单的所有活动中。

于 2011-11-14T07:33:31.350 回答
5

一种方法是对您的活动使用继承。创建一个实现选项菜单方法的基本 Activity,然后每个子 Activity 都将获得该功能。这是Android 开发者网站上推荐的方法:

提示:如果您的应用程序包含多个活动并且其中一些提供相同的选项菜单,请考虑创建一个除了 onCreateOptionsMenu() 和 onOptionsItemSelected() 方法之外什么都不实现的活动。然后为应该共享相同选项菜单的每个活动扩展此类。这样,您只需管理一组代码来处理菜单操作,并且每个后代类都继承菜单行为。

不幸的是,这对您不起作用,因为您不是从 Activity 本身继承而是从它的不同子类继承,但这是执行此操作的“正常”方式。

于 2011-11-14T04:30:54.163 回答
2

您可以将您的操作菜单封装在一个片段中。这样你只需要在你的activity的onCreate菜单中添加fragment即可。

创建片段后,您需要调用setHasOptionsMenu。要添加添加片段,请使用标签而不是布局 ID。

于 2011-11-14T07:56:59.613 回答