Android ListView上下文菜单:ActionMode.CallBack

在这篇文章中,我们要分析上下文菜单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行)。

参考: Android ListView上下文菜单:来自我们的JCG合作伙伴 Francesco Azzola在Surviving w / Android博客上的ActionMode.CallBack。

翻译自: https://www.javacodegeeks.com/2013/06/android-listview-context-menu-actionmode-callback.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是每行的注释: ``` ListView{ // 定义一个名为 listView 的列表视图控件 id: listView // 控件的唯一标识符 anchors.left: parent.left // 控件与其父控件左对齐 anchors.right: parent.right // 控件与其父控件右对齐 anchors.top: row.bottom // 控件顶部与名为 row 的控件底部对齐 anchors.bottom: parent.bottom // 控件底部与其父控件底部对齐 clip: true // 列表内容超出控件边界时进行裁剪 spacing: 0 // 列表项之间的间距为0 snapMode: ListView.SnapToItem // 当滚动结束时,列表项会自动对齐到最近的项 ScrollBar.vertical: ScrollBar{ // 垂直滚动条 id: ver_scrollbar // 控件的唯一标识符 visible: true // 控件可见 } model: ListModel{ // 列表数据模型 id: listModel // 控件的唯一标识符 ListElement{ // 列表项元素 time: "2021-03-12\n12:21:31" // 时间属性 floor: 1 // 楼层属性 } } delegate: Rectangle{ // 列表项的委托组件 id: infoRec // 控件的唯一标识符 implicitHeight: 640 // 控件的默认高度 implicitWidth: 480 // 控件的默认宽度 width: listView.width // 控件的宽度等于列表视图控件的宽度 height: 120 // 控件的高度为120 Rectangle{ // 控件背景 id: dim // 控件的唯一标识符 anchors.fill: parent // 控件占满父控件 color: "grey" // 控件背景颜色 opacity: 0.3 // 控件背景透明度 z: 300 // 控件的 Z 轴坐标 visible: tableItem.hightLightIndex == index // 根据高亮索引决定控件可见性 } // 时间显示区域 Rectangle { // 时间显示区域 id: timeRec // 控件的唯一标识符 width: 90 // 控件宽度 color: index % 2 ? tableItem.evenRowColor : tableItem.oddRowColor // 控件背景颜色 anchors.left: parent.left // 控件左对齐 anchors.top: parent.top // 控件顶部对齐 anchors.topMargin: floorRec.height // 控件顶部外边距为楼层显示控件的高度 anchors.bottom: parent.bottom // 控件底部对齐 Text { // 时间文本控件 id: timeText // 控件的唯一标识符 text: time === undefined ? errorStr : time // 控件显示的文本内容 anchors.fill: parent // 控件占满父控件 color: "#002949" // 控件文本颜色 font.pixelSize: tableItem.timeFontPixelSize // 控件文本字体大小 font.family: tableItem.contentFontFamily // 控件文本字体 horizontalAlignment: Text.AlignHCenter // 控件文本水平对齐方式 verticalAlignment: Text.AlignVCenter // 控件文本垂直对齐方式 wrapMode: Text.WrapAnywhere // 控件文本自动换行模式 clip: true // 控件文本超出边界时进行裁剪 function replaceBlank(str){ // 替换文本中的空格为换行符的方法 let newStr = str newStr = newStr.replace(" ", "\n") } } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值