繁体   English   中英

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

[英]Open context menu by clicking on menu options item

我使用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()但我应该在哪个视图中加入参数?

如果有人知道如何做到这一点,我想知道我必须如何做到这一点。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM