TabHost中在不同Tab中显示不同的Menu(菜单)

使用TabHost后,我们很多时候都有在不同的Tab中显示不同的菜单.
以下的是我足球即时比分中的一些截图(Tab为关注时显示的菜单).
TabHost中在不同Tab中显示不同的Menu(菜单)_第1张图片
以下是实现以上功能的主要代码片段(该代码是本人的应用足球即时比分的代码片段):

  1. public class SenseSoccerScoreActivity extends Activity{
  2.         public static final int MENU_SETUP_ID = 1;
  3.         public static final int MENU_ABOUT_ID = 2;
  4.         public static final int MENU_LEAVE_ID = 3;
  5.         public static final int MENU_CHECK_UPDATE_ID = 5;
  6.         public static final int MENU_EMPTY_FOCUS_ID = 4;
  7.         public static final int MENU_HISTORY_MATCH = 6;
  8.         public static final int MENU_RETURN = 7;
  9.         public static final int MENU_FILTER_SETTING = 8;
  10.         public static final int MENU_FUTURE_MATCH = 9;
  11.         public static final int MENU_BACK_ID = 10;
  12.         public static final int MENU_REFRESH_ID = 11;
  13.         public static final int MENU_CLEAN_CACHE = 12;

  14.         // ... 其它代码.
  15.         /**
  16.          * 当点击menu按钮时,添加菜单
  17.          * 之前一般是覆盖 onCreateOptionsMenu 方法的,现在要覆盖 onPrepareOptionsMenu
  18.          */
  19.     public boolean onPrepareOptionsMenu(Menu menu) {
  20.                 // *** 这里是实现的主要代码,先要清空菜单,然后再重新添加菜单
  21.             menu.clear(); // 清空menu
  22.             super.onPrepareOptionsMenu(menu);

  23.                 TabHost th = (TabHost) findViewById(R.id.tabhost);

  24.                 // 如果是关注赛事列表,需要添加清空菜单
  25.                 if(th.getCurrentTab() == 3){
  26.                         menu.add(0, MENU_SETUP_ID, 1, R.string.settingMenu)
  27.                                 .setIcon(android.R.drawable.ic_menu_preferences);
  28.                         menu.add(0, MENU_EMPTY_FOCUS_ID, 2, R.string.clearFocusMenu)
  29.                                 .setIcon(android.R.drawable.ic_menu_delete);
  30.                         menu.add(0, MENU_CHECK_UPDATE_ID, 3, R.string.text_check_update)
  31.                                 .setIcon(android.R.drawable.ic_menu_search);
  32.                         menu.add(0, MENU_ABOUT_ID, 4, R.string.aboutMenu)
  33.                                 .setIcon(android.R.drawable.ic_menu_help);
  34.                         menu.add(0, MENU_HISTORY_MATCH, 5, R.string.fullTimeMatch)
  35.                                 .setIcon(android.R.drawable.ic_menu_recent_history);
  36.                         menu.add(0, MENU_LEAVE_ID, 6, R.string.leaveMenu)
  37.                                 .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
  38.                         return true;
  39.                 } else {
  40.                         menu.add(0, MENU_SETUP_ID, 1, R.string.settingMenu)
  41.                                .setIcon(android.R.drawable.ic_menu_preferences);
  42.                         menu.add(0, MENU_CHECK_UPDATE_ID, 3, R.string.text_check_update)
  43.                                .setIcon(android.R.drawable.ic_menu_search);
  44.                         menu.add(0, MENU_ABOUT_ID, 4, R.string.aboutMenu)
  45.                                .setIcon(android.R.drawable.ic_menu_help);
  46.                         menu.add(0, MENU_HISTORY_MATCH, 5, R.string.fullTimeMatch)
  47.                                .setIcon(android.R.drawable.ic_menu_recent_history);
  48.                         menu.add(0, MENU_LEAVE_ID, 7, R.string.leaveMenu)
  49.                                .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
  50.                         return true;
  51.                 }
  52.     }

  53.         /**
  54.          * 当点击相应的菜单后,执行响应的事件
  55.          */
  56.         public boolean onOptionsItemSelected(MenuItem item){
  57.                 Intent intent = null;
  58.         switch (item.getItemId()){
  59.                 // 设置
  60.         case MENU_SETUP_ID:
  61.                 intent = new Intent();  
  62.                 intent.setClass(this, SettingActivity.class);
  63.             this.startActivity(intent);  
  64.             break;

  65.             // 清空关注赛事列表
  66.         case MENU_EMPTY_FOCUS_ID:
  67.                 MatchManager.getInstance(this).clearFocus();
  68.                 updateFocusMatchUI();
  69.             break;

  70.             // 检查更新
  71.         case MENU_CHECK_UPDATE_ID:
  72.             ProgressDialog checkUpdateDialog = buildCheckUpdateView();
  73.             checkUpdateDialog.show();
  74.             break;

  75.             // 关于
  76.         case MENU_ABOUT_ID:
  77.             AlertDialog dialog = buildAboutView();
  78.             dialog.show();
  79.             break;

  80.         // ... 实现其它的,代码就省略了...                      

  81.         return super.onOptionsItemSelected(item);
  82.         }
  83. }
复制代码
实现以上效果的思路是:覆盖 onPrepareOptionsMenu 而不是 onCreateOptionsMenu 方法的. 因为onCreateOptionsMenu的方法只会执行一次,就是第一次点击menu键时才会执行.而onPrepareOptionsMenu每一次点击menu键都会执行.这样,我们就可以先清空menu的内容,再重新添加menu.这就是实现在不同Tab中显示不同菜单(Menu)的原理.

  1.   public boolean onPrepareOptionsMenu(Menu menu) {
  2.         // *** 这里是实现的主要代码,先要清空菜单,然后再重新添加菜单
  3.             menu.clear(); // 清空menu
  4.             super.onPrepareOptionsMenu(menu);

  5.         // 添加所需要的菜单...
  6.         menu.add(....);
  7.   }

你可能感兴趣的:(tabhost,menu)