[英]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.