我使用ActivityGroup
时遇到一个问题。我在ActivityGroup
中有两个活动,它们都使用菜单(覆盖onCreateOptionMenu和onOptionsItemSelected)。
嗯,问题是当我按下菜单键时,组中的第二个活动没有显示菜单。第一个活动正常显示菜单。
关于这个问题的任何想法?
我在子活动中有这段代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, MENU_REFRESH, 0, R.string.menu_refresh).setIcon(R.drawable.ic_menu_refresh);
return result;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_REFRESH:
Log.d(TAG,"REFRESH");
refresh();
return true;
}
return super.onOptionsItemSelected(item);
}
答案 0 :(得分:7)
处理此问题的另一个好方法是使用ActivityGroup的LocalActivityManager。获取本地活动管理器,获取当前活动,并执行该活动的适当方法:
public boolean onPrepareOptionsMenu(Menu menu) {
//super.onPrepareOptionsMenu(menu);
return getLocalActivityManager().getCurrentActivity()
.onCreateOptionsMenu(menu);
}
public boolean onCreateOptionsMenu(Menu menu) {
//super.onCreateOptionsMenu(menu);
return getLocalActivityManager().getCurrentActivity()
.onCreateOptionsMenu(menu);
}
public boolean onMenuItemSelected(int featureId, MenuItem item) {
//super.onMenuItemSelected(featureId, item);
return getLocalActivityManager().getCurrentActivity()
.onMenuItemSelected(featureId, item);
}
注意:使用此策略时,不得从子活动调用super.onCreateOptionsMenu - 这样做会导致堆栈溢出异常。我不确定在*方法上调用超类的目的是什么,因为我省略了它们并且没有看到任何负面结果。 (......)
答案 1 :(得分:2)
您需要覆盖活动组中的菜单方法,并在子活动上调用相应的方法。请参阅此文章:How to Create Options Menu on Child Activity inside an ActivityGroup
public class TestGroup extends ActivityGroup {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//start child activity
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item);
}
}
答案 2 :(得分:2)
在tabGroupActivity上使用此代码
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// TODO Auto-generated method stub
return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item);
}
在两个子活动中使用下面给出的代码
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_1, menu);
return true;
}// menu_1 is the xml file in menu folder
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.weekly:
Intent weekly = new Intent(getParent(),Activity1.class);
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("weeklyview", weekly);
break;
case R.id.daily :
Intent daily = new Intent(getParent(),Activity2.class);
TabGroupActivity parentActivity2 = (TabGroupActivity)getParent();
parentActivity2.startChildActivity("daily", daily);
break;
default:
break;
}
//use return true
return true;
}
答案 3 :(得分:1)
检查this主题。
菜单可以在父活动中处理,但可以在子活动中创建
答案 4 :(得分:1)
另一种方法是在ActivityGroup根目录中创建菜单,然后使用public boolean onPrepareOptionsMenu(菜单菜单)清除并重新添加菜单项。
在ActivityGroup类中:
@Override public boolean onCreateOptionsMenu(Menu menu) { //what is the current activity? menu.add(0, 0, 0, "holder"); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { //start a new menu.clear(); //add some menu options .getLocalActivityManager().getCurrentActivity().onPrepareOptionsMenu(menu); return super.onPrepareOptionsMenu(menu); }
活动:
@Override public boolean onPrepareOptionsMenu(Menu menu) { //add menus or inflate here return true; }