2011-11-14 75 views
6

是否有一种方便的方式在多个活动中显示相同的选项菜单选项?重复使用选项菜单代码

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

  1. 七天指南(TabActivity 7个选项卡)
  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: 
     ... 
    ... 
    } 
} 

。b目前看来我需要将它复制/粘贴到另外两个我不喜欢的活动中。如果我将选项菜单代码更改为一个,我还需要为其他两个选项执行此操作。

我能想到的唯一的选择是我有一个“助手”类(POJO)到我可以添加的方法和传递context成以允许使用getMenuInflator()方法和其他方法的我能通过的结果item.getItemId()进入处理与开关案件。

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

回答

5

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

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

不幸的是这不会为你工作,你不从活动本身继承,但不同的子类它,但是这是“正常”的方式来做到这一点。

+0

因为事实证明我忘了7天指南活动的标签内容实际上是ListActivitys - 我已经将'今天的所有节目...'活动(我的问题中的第3个)更改为也是ListActivity并定义了一个基类,三者现在都扩展了。无法看到树林的那些时刻之一。谢谢。 – Squonk

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

这将让你可以在一个地方保存响应选择你的基本菜单项的代码,所以不需要担心将它复制粘贴到所有具有相同菜单的活动上。

+0

完美a.ch.伴侣。 –

2

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

一旦创建了片段,您需要致电setHasOptionsMenu。 要添加添加片段,请使用标记而不是布局ID。

+0

嗨。你有什么好的例子(教程或任何例子)?片段对我来说是相当新的。 – xDragonZ

+0

以此开头http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

请注意,如果您使用的是API级别11或更高版本 –