点击菜单选项项目以打开上下文菜单。

4

我使用Android制作应用程序。 我有一个活动,在该活动中创建以下选项菜单:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.mymenu, menu);
    return true;
}

菜单是从一个xml文件中加载的:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="Item1" android:id="@+id/item1" /></menu>

当我点击项目1时,我在我的活动中使用onOptionsItemSelected来处理点击事件,代码如下:
    @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case R.id.item1 :
        // here, I would like to open a contextual menu
        return true;
    default :
        return super.onOptionsItemSelected(item);
    }
}

因此,当用户单击项目1时,我希望打开上下文菜单。首先,我不知道是否可以直接打开上下文菜单而不使用在屏幕上保持位置的方式,就像互联网上的几个教程所示。

如果可能的话,我该如何以那种方式打开上下文菜单?

我考虑在我的项目1中使用registerForContextMenu()openContextMenu(),但应将哪个视图放入参数中?

如果有人有关于如何做到这一点的想法,我想知道我应该怎么做。

3个回答

4
如果您真正想要一个上下文菜单,我建议按照Android的设计,在特定项上进行长按。人们已经习惯了这种方式,应用程序不应该有所不同。
另一种选择稍微复杂一些。您可以将菜单加载到一个单独的活动中,并将其样式设置为对话框窗口(您知道具有淡出半透明背景)。这可以通过在manifest.xml文件中为您的活动应用Theme.Dialog样式轻松完成:
<activity android:name=".activities.TagPopupActivity"
            android:label="Tagging" android:theme="@android:style/Theme.Dialog">
                ...
</activity>

或者,您也可以按照这里所述的直接创建一个对话框窗口。然后通过在主列表活动中实现适当的点击侦听器来获取上下文(即列表点击),当用户单击项目时,您会检索其ID并将其打包成一个捆绑包,将其转发到您的“菜单”-活动样式作为弹出式对话框。


1
谢谢你的回答。实际上,我从Android开始学习。所以我不太清楚做事情的最佳实践是什么。在我的脑海中,有两种可能性。首先,我创建了一个上下文菜单,但显然这对用户体验不是一个好主意。其次,我想通过点击项目来启动新的活动,在其中显示我想要向用户提供的选择。也许这是一个更好的主意。因此,我认为我将编写第二个想法的代码。 - sylsau
3
即使是谷歌的应用程序也会从菜单项中打开上下文菜单,因此我认为长按并不是实现它的正确方式。 - Jake Wilson
“通过单击菜单选项打开上下文菜单”的答案在哪里? - Muhammad Babar

1

我知道这篇文章已经有些年头了,但是我这里有另一个解决方案(快速但不太优雅)。

添加一个虚拟视图,并将其可见性设置为隐藏,使用此视图来触发上下文菜单。


0
private final int OPTION_1 = 21;
private final int OPTION_2 = 22;    

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.mymenu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    ActionMenuItemView btn = findViewById(item.getItemId());

    switch (item.getItemId()) {
        case R.id.action_share:
            PopupMenu popupMenu = new PopupMenu(this, btn);
            popupMenu.getMenu().add(0, OPTION_1, 0, "Option 1");
            popupMenu.getMenu().add(0, OPTION_2, 0, "Option 2");
            popupMenu.setOnMenuItemClickListener(this::onClickMenu);
            popupMenu.show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

private boolean onClickMenu(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case OPTION_1:
            // Clicked option 1
            break;
        case OPTION_2:
            // Clicked option 2
            break;
    }

    return false;
}

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