Android:通过长按弹出菜单项创建上下文菜单



当我的片段弹出菜单中的一个项目被长按时,我正试图找到一种创建浮动上下文菜单的方法。当我的布局中的菜单图标被点击时,弹出菜单就会出现,并显示存储在应用程序本地目录中的文件列表。当长按其中一个文件时,我希望出现一个浮动上下文菜单,为用户提供重命名或删除所选文件的选项。

根据Android开发者指南,可以通过将视图(如ListView)传递到registerForContextMenu()中来生成浮动上下文菜单。然后,程序员必须在所需的活动或片段中实现onCreateContextMenu(),即:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}

我很困惑,因为registerForContextMenu()接受View作为参数,但我试图将上下文菜单注册到Popup menu中的所有项,而不是ListView或GridView。我在下面包含了我的弹出菜单代码。当我的弹出菜单项被长按时,我如何实现浮动上下文菜单?

EDIT:这是我的新代码,它在"View popupMenuItemView="行上抛出一个null指针异常

trackSelectButton = (Button) v.findViewById(R.id.trackSelect);
trackSelectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
trackListing = getTrackNames();
PopupMenu popup = new PopupMenu(getActivity(), v);
for (int i = 0; i < trackListing.length; i++) {      //add a menu item for each existing track
popup.getMenu().add(0,i,0,trackListing[i].getName());    //my attempt to create a resource id (parameter #2) while adding the menu item 
popup.getMenu().findItem(i).getActionView().setTag(i);   //my attempt to set a tag to a menu item
View popupMenuItemView = getActivity().getWindow().getDecorView().findViewById(i); //nullpointer exception thrown here!
registerForContextMenu(popupMenuItemView); //never reached due to crash 
}
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.new_track:
trackSelectButton.setText("...");
Toast.makeText(getActivity(), "Name your new track.", Toast.LENGTH_SHORT).show();
txtTrackName.setVisibility(txtTrackName.VISIBLE);
return true;
default:
selectedTrackName = (item.getTitle().toString());
trackSelectButton.setText(selectedTrackName);
for (int i = 0; i < trackListing.length; i++) {      //add a menu item for each existing track
if (trackListing[i].getName().equals(selectedTrackName)) {
selectedTrack = trackListing[i];
AudioRecorder.setFile(selectedTrack);
}
}
return true;
}
}
});
MenuInflater popupInflater = popup.getMenuInflater();
popupInflater.inflate(R.menu.popup_menu_track_selection, popup.getMenu());
popup.show();
}
});

我认为没有办法在整个菜单上设置长点击侦听器。我建议您将弹出菜单中的每个项目单独注册为上下文菜单。

您可以使用以下内容,使用在菜单xml中设置的ID来获取菜单中每个菜单项的视图:

View menuItemView = getActivity().getWindow().getDecorView().findViewById(R.id.item_id);

然后将其传递给registerForContextMenu。

registerForContextMenu(menuItemView)

对每个菜单项执行此操作,然后在覆盖的onContextItemSelected(MenuItem项)中,您可以使用item.getItemId()上的开关为每个项添加基于其ID的逻辑。

EDIT由于您以编程方式添加菜单项,因此最好为MenuItem的视图指定一个标记。创建MenuItem后,可以通过menuItem.getActionView().setTag(whatever)获取视图。然后在onContextItemSelected中使用menuItem.getActionView().getTag()

最新更新