在这篇文章中,我们要分析上下文菜单 ( contextual action bar )。 这是与特定项目相关的菜单。 上下文菜单几乎可以应用于所有视图,但通常与ListView一起使用 。 我们谈论了很多列表视图,因为它是最重要的组件之一。 我们可以区分两种不同类型的上下文菜单:
- 浮动菜单
- 上下文动作模式(ActionMode)
浮动菜单用于低于3.0(API级别11)的Android版本。 从本质上讲,它是一个菜单,当用户长时间单击ListView项时出现。 您可以
在这里找到一个例子。 看起来如下图所示:
上下文动作模式是在Android 3.0或更高版本中引入的,它实质上是一个上下文栏,当用户长按一个项目时 ,它会显示在顶部 。 根据Android指南,这种菜单比浮动菜单要好。 在本文中,我们要分析如何创建此菜单。
创建上下文操作模式:定义ActionMode.CallBack接口
要创建上下文菜单,我们首先必须定义一个ActionMode.CallBack接口。 用户长时间单击ListView项时,将调用此接口。 代码如下:
private ActionMode.Callback modeCallBack = new ActionMode.Callback() {
public boolean onPrepareActionMode(ActionMode mode, Menu menu)
return false;
}
public void onDestroyActionMode(ActionMode mode) {
mode = null;
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return true;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
}
};
我们对第11行和第15行感兴趣。第一个是在屏幕顶部创建上下文动作栏的地方,在第15行是当用户选择菜单项之一时处理逻辑的地方。
我们要做的第一件事是创建菜单。 为了简单起见,我们可以假设只有两个菜单项,然后在res / menu下定义一个名为activity_main.xml的文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/edit"
android:icon="@android:drawable/ic_menu_edit"/>
<item android:id="@+id/delete"
android:icon="@android:drawable/ic_menu_delete"/>
</menu>
现在我们有了菜单,我们只需要将其“注入”到
onCreateActionMode方法。
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Options");
mode.getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
现在,当用户长按一个项目时,我们必须显示此上下文操作栏。
ActionMode和长按:onItemLongClickListener
如果我们想在用户长按时显示此上下文栏,我们只需在ListView上设置一个侦听器,即在源代码中称为lv。 因此,我们有:
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick (AdapterView parent, View view, int position, long id) {
System.out.println("Long click");
startActionMode(modeCallBack);
view.setSelected(true);
return true;
}
});
在第4行中,我们只需使用startActionMode方法启动上下文菜单。 现在的结果是:
如您在顶部看到的,我们有上下文操作栏。
上下文菜单项选择
现在,假设用户单击菜单项。 我们如何处理此事件? 好吧,如果我们回到ActionMode.CallBack,我们必须实现另一个方法onActionItemClicked 。 因此,我们有:
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.delete: {
aAdpt.remove( aAdpt.getItem(aAdpt.currentSelection) );
mode.finish();
break;
}
case R.id.edit: {
System.out.println(" edit ");
break;
}
default:
return false;
}
在第6行中,我们只需从适配器中删除所选项目。 要知道所选项目在ListView中的位置,我们将其存储在OnItemLongClickListener方法中。
aAdpt.currentSelection = position;
完成用户菜单项的选择后,我们必须关闭上下文操作栏callig mode.finish(第7行)。
翻译自: https://www.javacodegeeks.com/2013/06/android-listview-context-menu-actionmode-callback.html