如何创建多个上下文菜单?

4

我有一个活动,但希望为不同的UI组件拥有多个上下文菜单。

例如,我有一个ListView,它将响应以下内容:

@Override  
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {  

        super.onCreateContextMenu(menu, v, menuInfo);  
        menu.setHeaderTitle("Selection Options");  
        menu.add(0, v.getId(), 0, "Remove");  
    }  

我该如何为一个ImageView创建另一个上下文菜单,在onClick事件中使用?

3个回答

10

实际上,这种方法是动态更改选项菜单。要创建多个上下文菜单,您必须在onCreateContextMenu方法中定义它们。正如您所见,此方法接收一个视图作为参数,该视图是您单击以使菜单出现的视图。因此,您保留用于ListView的方法,并添加一些条件来区分您的Views。然后,您使用这些条件来创建所需的上下文菜单

注意:上下文菜单不支持图标,因此如果您想要图标、图片或类似的东西,您将不得不使用您动态更改的选项菜单或创建一个带有自定义视图、意图和所有内容的自定义菜单。


我该如何确定v是ListView还是ImageView? - Sheehan Alam
1
在Android中,您可以为视图添加标签,因此您只需要在View上使用getTag即可。如果您知道它,还可以使用View的id。 - Sephy
谢谢你,Sephy!“正如您所看到的,此方法接收一个View作为参数,这个View是您单击以使菜单出现的View。” 这行代码救了我! - Ashwani

2

您可以利用标签

在注册相关上下文菜单之前,请在您的rootView上设置一个标签:

private static final Integer CONTEXT_MENU_YOUR_ACTION = 1; //indicator of the current context menu type

// register for your context menu
rootView.setTag(R.id.TAG_CONTEXT_MENU_ID, CONTEXT_MENU_YOUR_ACTION);
registerForContextMenu(rootView);
rootView.showContextMenu();
unregisterForContextMenu(rootView);

然后在 onCreateContextMenu 中,您可以检查 rootView 上的当前标签:

Integer contextMenuId = (Integer) rootView.getTag(R.id.TAG_CONTEXT_MENU_ID);

if (CONTEXT_MENU_YOUR_ACTION.equals(contextMenuId)) {
    //custom your context menu
}

对于onContextItemSelected方法,同样适用该检查。


-5
@Override
public boolean onPrepareOptionsMenu(Menu menu) 
{
    // TODO Auto-generated method stub
    return super.onPrepareOptionsMenu(menu);
}

您可以在此方法中检查您的条件。这将在菜单对用户可见之前触发。


我应该检查什么条件? - Sheehan Alam
保持一个标志或其他东西,如果用户点击了ImageView,则显示更新后的菜单,否则显示正常菜单。 - DeRagan
2
OP 询问了关于上下文菜单的问题,而您的方法是针对选项菜单的。 - CommonsWare

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