是否有方便的方法在多个活动中显示相同的“选项”菜单选项?
示例:在我的应用中,我以三种方式之一显示电视指南。
对于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进行处理。
使用相同的“选项”菜单进行多项活动的正常方法是什么?
答案 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。