单击菜单选项项打开上下文菜单

时间:2011-02-05 15:29:15

标签: android menu contextmenu

我使用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 个答案:

答案 0 :(得分:4)

如果您真的想要一个上下文菜单,那么我将使用Android中设计的上下文菜单,通过长按特定项目。人们已经习惯了这一点,应用程序应该没有区别。

替代方案有点复杂。您可以做的是将您的菜单加载到一个单独的活动中,您将其设置为对话框窗口(您知道具有褪色的半透明背景)。这可以通过在manifest.xml文件中将Theme.Dialog样式应用于您的活动来轻松完成:

<activity android:name=".activities.TagPopupActivity"
            android:label="Tagging" android:theme="@android:style/Theme.Dialog">
                ...
</activity>

或者,您也可以直接创建一个对话窗口,如here所述。然后,通过在主列表活动中实现相应的单击侦听器来获取上下文(即单击列表),然后当用户单击该项时,您将检索其ID并将其打包到转发到“菜单”的包中-activity设计为弹出对话框。

答案 1 :(得分:1)

我知道这篇文章很老但是这是另一种解决方案(快速但不太性感)。

添加一个虚构视图,其中可见性设置已消失,并使用此视图触发上下文菜单。

答案 2 :(得分: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;
}