这是一个影响 3.0 之前平台的问题,即当 Sherlock 充当代理以提供操作栏菜单项时。
我有一个片段活动,其中包含两个片段,每个片段都有自己的一组选项菜单。 活动启动时,将显示第一个片段选项卡,其菜单项正常工作。 但是,当我第一次切换到另一个选项卡时,它的菜单项没有响应。 如果我切换回第一个选项卡并再次选择另一个选项卡,它们将开始正常触发。
看起来这是一个已知问题。 在此处查看讨论。
我现在的解决方法是首次选择第二个选项卡时检测,并以编程方式切换回第一个选项卡。 这会强制用户再次选择第二个选项卡,但从那时起,只要用户留在该活动中,它就可以正常工作。
我想知道是否有其他人找到了解决这个问题的更优雅的解决方案。 谢谢!
第一个片段:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
moveMenuItem = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.MOVE_FLASHES_ID, 0, R.string.move_flashes);
cloneMenuItem = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.CLONE_FLASHES_ID, 0, R.string.clone_flashes);
deleteMenuItem = menu.add(Flashum.MENU_GROUP_MULTI, Flashum.DELETE_FLASHES_ID, 0, R.string.delete_flashes);
moveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
moveMenuItem.setIcon(R.drawable.move2red);
cloneMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
cloneMenuItem.setIcon(R.drawable.hard_drive_clone);
deleteMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
deleteMenuItem.setIcon(R.drawable.delete);
}
第二个片段:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
saveMenuItem = menu.add(Flashum.MENU_GROUP_SAVE, Flashum.SAVE_CHANGES_ID, 0, R.string.save_changes);
saveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
saveMenuItem.setIcon(R.drawable.save);
menu.setGroupVisible(Flashum.MENU_GROUP_SAVE, true);
recMenuItem = menu.add(Flashum.MENU_GROUP_REC, Flashum.RECORD_ID, 0, R.string.record);
recMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
recMenuItem.setIcon(R.drawable.microphonehot);
}
尝试在片段中充气之前清除菜单。所以在你的片段中 onCreateOptionsMenu 方法调用 menu.clear();在开始时,然后给菜单充气。像这样:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
saveMenuItem = menu.add(Flashum.MENU_GROUP_SAVE, Flashum.SAVE_CHANGES_ID, 0, R.string.save_changes);
saveMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
saveMenuItem.setIcon(R.drawable.save);
menu.setGroupVisible(Flashum.MENU_GROUP_SAVE, true);
recMenuItem = menu.add(Flashum.MENU_GROUP_REC, Flashum.RECORD_ID, 0, R.string.record);
recMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
recMenuItem.setIcon(R.drawable.microphonehot);
}
在两个片段中尝试一下。
不要检测何时选择了第二个选项卡,而是使用发布延迟方法在 onCreate of Activity 中以编程方式切换片段。例如,我有 3 个片段,我以相反的顺序(2, 1, 0)切换它们,它在活动开始时用一个漂亮的动画愚弄了你的用户:
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB){
mIndicator.setCurrentItem(2);
mIndicator.postDelayed(new Runnable() {
public void run() {
mIndicator.setCurrentItem(1);
mIndicator.postDelayed(new Runnable() {
public void run() {
mIndicator.setCurrentItem(0);
}}, 100);
}}, 100);
}