Android Contextual Menus之二:contextual action mode

  接上文:Android Contextual Menus之一:floating context menu

  ContextMenu的两种形式,上文讨论了第一种形式,兼容性较好。

  本文讨论第二种形式,Android 3.0,即API Level 11之后可用。

Contextual action mode

  Contextual action mode是 ActionMode 的系统实现,关注于执行上下文相关动作的用户交互。

  当用户通过选择一个项目使能这个模式,一个contextual action bar就会出现在屏幕上方,显示用户对当前选中的项目可以执行的动作。

  当这个模式使能时,用户可以:选择多个项目(如果你允许的话)、取消项目选择、在activity中继续浏览(只要你允许)。

  当用户取消对所有项目的选择、按下Back键、或者点击bar左边的完成按钮之后,action mode就被禁用,contextual action bar消失。

  注意:contextual action bar没有必须 action bar关联,它们是独立的。

CAB的使用情形

  对于提供上下文动作的View,通常在这两种情况下(情况之一或both)调用contextual action mode

  1.用户在View上长按;

  2.用户选择了View中的CheckBox或者类似控件。

  你的应用如何invoke这个contextual action mode,以及如何定义每个action取决于你自己的设计。

  两种基本的设计:

  1.对个体任意views的上下文相关操作;

  For contextual actions on individual, arbitrary views.

  2.对一组数据的批处理,比如ListView或GridView中的项目,允许用户选择多个项目然后对它们整体执行一个动作。

  For batch contextual actions on groups of items in a ListView or GridView (allowing the user to select multiple items and perform an action on them all).

  下面分别讲讲这两种情景下的实现。

Enabling the contextual action mode for individual views

  如果你想在用户选择指定View的时候invoke contextual action mode(CAB),你应该:

  1.实现ActionMode.Callback接口。

  在这个接口的回调方法中,你可以指定contextual action bar的动作,响应action items的点击事件,还有处理action mode的生命周期事件。

  2.当你想要show这个bar的时候(比如用户长按view的时候),调用 startActionMode()方法。

  例子代码:

package com.example.mengdd.hellocontextmenu;import android.app.Activity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.TextView;
import android.widget.Toast;public class ContextualActionModeActivity extends Activity {private TextView mTextView = null;private ActionMode mActionMode = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_contextual_action_mode);mTextView = (TextView) findViewById(R.id.textView2);mTextView.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {if (mActionMode != null) {return false;}// Start the CAB using the ActionMode.Callback defined abovemActionMode = startActionMode(mActionModeCallback);view.setSelected(true);return true;}});}private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {// Called when the action mode is created; startActionMode() was called
        @Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {// Inflate a menu resource providing context menu itemsMenuInflater inflater = mode.getMenuInflater();inflater.inflate(R.menu.context_menu1, menu);return true;}// Called each time the action mode is shown. Always called after// onCreateActionMode, but// may be called multiple times if the mode is invalidated.
        @Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {return false; // Return false if nothing is done
        }// Called when the user selects a contextual menu item
        @Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {switch (item.getItemId()) {case R.id.edit:showEditor();mode.finish(); // Action picked, so close the CABreturn true;default:return false;}}// Called when the user exits the action mode
        @Overridepublic void onDestroyActionMode(ActionMode mode) {mActionMode = null;}};private void showEditor() {Toast.makeText(ContextualActionModeActivity.this, "edit",Toast.LENGTH_LONG).show();}
}

CAB Demo1

Enabling batch contextual actions in a ListView or GridView

  对于ListView和GridView这样的集合类,想让用户进行批处理操作,应该如下:

  1.实现 AbsListView.MultiChoiceModeListener接口,通过setMultiChoiceModeListener()方法把它set进集合类控件。

  在这个listener的回调方法中,你可以指定contextual action bar的动作,响应action item的点击事件,处理其他继承自ActionMode.Callback的回调。

  2.调用 setChoiceMode()方法,使用参数 CHOICE_MODE_MULTIPLE_MODAL 。

  例子代码:

package com.example.mengdd.hellocontextmenu;import android.app.ListActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuInflater;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;public class ListCABActivity extends ListActivity {private ListView mListView = null;private String[] mStrings = Cheeses.sCheeseStrings;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Use an existing ListAdapter that will map an array// of strings to TextViewssetListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, mStrings));mListView = getListView();mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);mListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {@Overridepublic void onItemCheckedStateChanged(ActionMode mode,int position, long id, boolean checked) {// Here you can do something when items are// selected/de-selected,// such as update the title in the CAB
}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {// Respond to clicks on the actions in the CABswitch (item.getItemId()) {case R.id.delete:deleteSelectedItems();mode.finish(); // Action picked, so close the CABreturn true;default:return false;}}@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {// Inflate the menu for the CABMenuInflater inflater = mode.getMenuInflater();inflater.inflate(R.menu.context_menu2, menu);return true;}@Overridepublic void onDestroyActionMode(ActionMode mode) {// Here you can make any necessary updates to the activity when// the CAB is removed. By default, selected items are// deselected/unchecked.
            }@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {// Here you can perform updates to the CAB due to// an invalidate() requestreturn false;}});}private void deleteSelectedItems() {Toast.makeText(ListCABActivity.this, "delete!", Toast.LENGTH_LONG).show();}
}

CAB Demo2

参考资料

  API Guides: Menus->Using the contextual action mode

  http://developer.android.com/guide/topics/ui/menus.html#CAB

转载于:https://www.cnblogs.com/mengdd/p/3565213.html

Android Contextual Menus之二:contextual action mode相关推荐

  1. Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法...

    在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...

  2. Android中 自定义logo二维码绘制(仿微信QQ二维码)

    自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...

  3. Android百度地图(二)结合方向传感器我们自己定位哪里走

    Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步修改,有 ...

  4. Android 天气APP(二十九)壁纸设置、图片查看、图片保存

    上一篇:Android 天气APP(二十八)地图搜索定位 效果图 开发流程 一.前情提要 二.正式开发 1. 列表数据填充 2. 浮动按钮的交互 3. 其他优化 4. 运行效果图 三.文末 一.前情提 ...

  5. Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)

    上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...

  6. android如何在底部显示四个按钮,[Android系列—] 四. 添加操作栏(Action Bar)

    [Android系列-] 4. 添加操作栏(Action Bar) 前言 操作栏是最重要的设计元素之一,使用它来实现你的应用程序活动.通过提供多种用户界面功能, 使应用程序快速和其他的Andorid应 ...

  7. android开发实验报告二,《Android 移动应用开发》实验报告-范本2(33页)-原创力文档...

    实验1<Android活动的使用> 实验学时: 2 每组人数: 1 实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实 ...

  8. Java IO在Android中应用(二):APK加固

    Java I/O在Android中应用(二):APK加固套壳 前言(废话) 我,有两把键盘,第一把是Poker III(黑轴),第二把是Poker II(红轴).工作的时候我常用的是红轴的Poker ...

  9. Android studio使用心得(二)— 打包签名apk发布

    1.-–Android Studio菜单   Build->Generate Signed APK 2.--Create new.. 3.---跟eclipse里面一样,添加keystore 信 ...

最新文章

  1. 厦门口岸检出今年首例登革热病例
  2. html选择一个元素,css3选择第n个元素
  3. MATLAB点云处理:读取、展示、最近邻、ICP算法求取转移矩阵、旋转
  4. Nginx 内置绑定变量的介绍
  5. 技本功丨知否知否,Redux源码竟如此意味深长(下集)
  6. Nginx----原理
  7. MANIFEST.MF文件的编辑注意事项
  8. 「轻阅读」基于 Flink SQL CDC的实时数据同步方案,附视频教程
  9. Julia: Dates =DateFormat, format,parse.......
  10. 10.柱状图-----人口普查各地区人口排行榜
  11. 有人还原出了历史上的皇帝,朱元璋居然还挺帅?
  12. 雅猴的脚印——2019年下半年
  13. 基于机器学习进行销售预测分析
  14. Android 设置Switch样式
  15. 关于生僻字乱码的问题
  16. SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
  17. mysql 多表 left join_MySql left join 多表连接查询优化语句
  18. hadoop学习笔记(八):Java HDFS API
  19. Asp.Net MVC导出下载excel
  20. 突然觉得。。。好累!!!

热门文章

  1. 查找nginx安装的路径以及相关安装操作命令
  2. AtCoder Beginner Contest 129
  3. Bootstrap table方法,Bootstrap table事件,配置
  4. BZOJ2821: 作诗(Poetize)
  5. http协商缓存VS强缓存
  6. 关于arcgis发布wfs问题
  7. [Google Android] Creating Your Own Spelling Checker Service
  8. PHP获取 当前页面名称、主机名、URL完整地址、URL参数、获取IP
  9. C#用了多线程界面还是卡死
  10. EventBus的简单使用