我使用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()
,但我应该在哪个视图中输入参数?
如果有人知道如何做到这一点,我想知道我该怎么做。
答案 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;
}