I have one problem using ActivityGroup
. I have two activities inside an ActivityGroup
and both of them use a menu (overriding the onCreateOptionMenu and onOptionsItemSelected).
Well, the problem is that the second activity in the group doesn't show the menu when I press the menu Key. The first activity works fine showing the menu.
Any idea about this issue?
I have this code in child activity:
@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);
}
Check this thread.
Menu's can be handled in the parent
aactivity, but created in the child
activity
Another nice way of handling this is by using the ActivityGroup's LocalActivityManager. Get the local activity manager, get the current activity, and perform that activity's appropriate method:
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);
}
Note: using this strategy, you must not call super.onCreateOptionsMenu from the child activity- doing so causes a stack overflow exception. I'm not sure what the purpose of calling the superclass's on* methods, as I've omitted them and have seen no negative results. (... yet)
You need to override the menu methods in the activity group, and call the corresponding methods on the child activity. See this article: 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);
}
}
use this code on the 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);
}
use the code which given below in both 2 child Activities
@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;
}
Yet another approach is to create the menu in the ActivityGroup root and then use public boolean onPrepareOptionsMenu(Menu menu) to clear and re-add menu items.
In ActivityGroup class:
@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);
}
In Activity:
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{ //add menus or inflate here
return true;
}