TabHost中在不同Tab中显示不同的Menu(菜单)
时间:2011年07月11日作者:么吉查看次数:301 views评论次数:0
使用TabHost后,我们很多时候都有在不同的Tab中显示不同的菜单.
以下的是我足球即时比分中的一些截图(Tab为关注时显示的菜单).

以下是实现以上功能的主要代码片段(该代码是本人的应用足球即时比分的代码片段):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | public class SenseSoccerScoreActivity extends Activity{ public static final int MENU_SETUP_ID = 1; public static final int MENU_ABOUT_ID = 2; public static final int MENU_LEAVE_ID = 3; public static final int MENU_CHECK_UPDATE_ID = 5; public static final int MENU_EMPTY_FOCUS_ID = 4; public static final int MENU_HISTORY_MATCH = 6; public static final int MENU_RETURN = 7; public static final int MENU_FILTER_SETTING = 8; public static final int MENU_FUTURE_MATCH = 9; public static final int MENU_BACK_ID = 10; public static final int MENU_REFRESH_ID = 11; public static final int MENU_CLEAN_CACHE = 12; // ... 其它代码. /** * 当点击menu按钮时,添加菜单 * 之前一般是覆盖 onCreateOptionsMenu 方法的,现在要覆盖 onPrepareOptionsMenu */ public boolean onPrepareOptionsMenu(Menu menu) { // *** 这里是实现的主要代码,先要清空菜单,然后再重新添加菜单 menu.clear(); // 清空menu super.onPrepareOptionsMenu(menu); TabHost th = (TabHost) findViewById(R.id.tabhost); // 如果是关注赛事列表,需要添加清空菜单 if(th.getCurrentTab() == 3){ menu.add(0, MENU_SETUP_ID, 1, R.string.settingMenu) .setIcon(android.R.drawable.ic_menu_preferences); menu.add(0, MENU_EMPTY_FOCUS_ID, 2, R.string.clearFocusMenu) .setIcon(android.R.drawable.ic_menu_delete); menu.add(0, MENU_CHECK_UPDATE_ID, 3, R.string.text_check_update) .setIcon(android.R.drawable.ic_menu_search); menu.add(0, MENU_ABOUT_ID, 4, R.string.aboutMenu) .setIcon(android.R.drawable.ic_menu_help); menu.add(0, MENU_HISTORY_MATCH, 5, R.string.fullTimeMatch) .setIcon(android.R.drawable.ic_menu_recent_history); menu.add(0, MENU_LEAVE_ID, 6, R.string.leaveMenu) .setIcon(android.R.drawable.ic_menu_close_clear_cancel); return true; } else { menu.add(0, MENU_SETUP_ID, 1, R.string.settingMenu) .setIcon(android.R.drawable.ic_menu_preferences); menu.add(0, MENU_CHECK_UPDATE_ID, 3, R.string.text_check_update) .setIcon(android.R.drawable.ic_menu_search); menu.add(0, MENU_ABOUT_ID, 4, R.string.aboutMenu) .setIcon(android.R.drawable.ic_menu_help); menu.add(0, MENU_HISTORY_MATCH, 5, R.string.fullTimeMatch) .setIcon(android.R.drawable.ic_menu_recent_history); menu.add(0, MENU_LEAVE_ID, 7, R.string.leaveMenu) .setIcon(android.R.drawable.ic_menu_close_clear_cancel); return true; } } /** * 当点击相应的菜单后,执行响应的事件 */ public boolean onOptionsItemSelected(MenuItem item){ Intent intent = null; switch (item.getItemId()){ // 设置 case MENU_SETUP_ID: intent = new Intent(); intent.setClass(this, SettingActivity.class); this.startActivity(intent); break; // 清空关注赛事列表 case MENU_EMPTY_FOCUS_ID: MatchManager.getInstance(this).clearFocus(); updateFocusMatchUI(); break; // 检查更新 case MENU_CHECK_UPDATE_ID: ProgressDialog checkUpdateDialog = buildCheckUpdateView(); checkUpdateDialog.show(); break; // 关于 case MENU_ABOUT_ID: AlertDialog dialog = buildAboutView(); dialog.show(); break; // ... 实现其它的,代码就省略了... return super.onOptionsItemSelected(item); } } |
实现以上效果的思路是:覆盖 onPrepareOptionsMenu 而不是 onCreateOptionsMenu 方法的. 因为onCreateOptionsMenu的方法只会执行一次,就是第一次点击menu键时才会执行.而onPrepareOptionsMenu每一次点击menu键都会执行.这样,我们就可以先清空menu的内容,再重新添加menu.这就是实现在不同Tab中显示不同菜单(Menu)的原理.
1 2 3 4 5 6 7 8 | public boolean onPrepareOptionsMenu(Menu menu) { // *** 这里是实现的主要代码,先要清空菜单,然后再重新添加菜单 menu.clear(); // 清空menu super.onPrepareOptionsMenu(menu); // 添加所需要的菜单... menu.add(....); } |
相关博文:
[ Android中TabHost切换不同的Activity ]
[ Android中TabHost的使用 ]
返回 : Android开发博文汇总



最新评论
我在调出这个窗口的时候,暂停了我 »
Post:2011-11-29 19:31:02出8.0.5了,能否做一下破解呢? :mrgreen:
Post:2011-11-10 17:05:58:razz: 一直在找这个东西,甚至也 »
Post:2011-10-21 21:29:42Alarm 这个类是一个挺有意思的类, »
Post:2011-10-19 15:05:46回来看看等DbVisualizer 8.0 新版 »
Post:2011-10-10 19:20:21好东西,收藏了。
Post:2011-09-25 22:36:38:twisted: 不麻烦的话,能否能做 »
Post:2011-09-05 16:10:59你可以到hostloc去找IDC,很多。 X »
Post:2011-08-28 12:37:23