重新使用选项菜单代码

时间:2011-11-14 02:14:18

标签: android android-optionsmenu

是否有方便的方法在多个活动中显示相同的“选项”菜单选项?

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

  1. 七天指南(带有7个标签的TabActivity)
  2. 所有频道'现在显示'(ListActivity)
  3. 今天所有节目按开始时间显示(活动 - 可以轻松更改为ListActivity)
  4. 对于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()的结果传递给使用switch-case进行处理。

    使用相同的“选项”菜单进行多项活动的正常方法是什么?

3 个答案:

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

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

答案 1 :(得分:5)

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

  

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

不幸的是,这对你不起作用,因为你不是从Activity本身继承但是它的子类不同,但这是“正常”的方法。

答案 2 :(得分:2)

您可以将操作菜单封装在fragment中。这样,您只需要在活动的onCreate菜单中添加片段。

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