Android ActivityGroup 菜单问题

5

我在使用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);
}

我认为这是第二个活动的惊人行为。试着在当前第二个活动上选择任何控件,然后按菜单按钮。菜单会出现,但我不知道为什么。 - Pankaj Kumar
我遇到了同样的问题,第二个活动也出现了相同的菜单。即使我为第二个活动定义了一个单独的菜单,也是如此。请告诉我如何解决这个问题。 - Sam
5个回答

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-这样会导致堆栈溢出异常。我不确定调用超类的on*方法的目的是什么,因为我已经省略了它们,并且没有看到任何负面结果。(...但)

2

您需要在活动组中覆盖菜单方法,并在子活动上调用相应的方法。请参阅本文:如何在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

在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;
}

1
另一种方法是在ActivityGroup根部创建菜单,然后使用public boolean onPrepareOptionsMenu(Menu menu)来清除并重新添加菜单项。
在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;
}

0

查看帖子。

菜单可以在父活动中处理,但在子活动中创建


好的,但是如果我在父活动中处理菜单,如何调用子活动的方法呢? - Gerardo
@xger86x:这就是问题所在。你应该在子活动中处理菜单,而不是在父活动中处理。 - Macarse
@macarse 好的,那么...我该怎么做呢?你明白我的问题吗?如果我必须在子活动上调用一个方法,我就不能从父活动中调用。 - Gerardo
@xger86x:我的理解是你将菜单代码放在了父级上,而应该将其放在子级上。如果不是这种情况,请提供一些代码,以便更容易地帮助你。谢谢。 - Macarse
@xger86x:好酷!我猜我现在明白了。将onCreateOptionMenu放在子类里面,将onOptionItemSelected放在父类里面。而且我想你可以使用LocalActivityManager从特定的活动中调用一个方法。试试看吧! - Macarse
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接