Android Contextual Menus之二:contextual action mode
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相关推荐
- Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法...
在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...
- Android中 自定义logo二维码绘制(仿微信QQ二维码)
自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...
- Android百度地图(二)结合方向传感器我们自己定位哪里走
Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步修改,有 ...
- Android 天气APP(二十九)壁纸设置、图片查看、图片保存
上一篇:Android 天气APP(二十八)地图搜索定位 效果图 开发流程 一.前情提要 二.正式开发 1. 列表数据填充 2. 浮动按钮的交互 3. 其他优化 4. 运行效果图 三.文末 一.前情提 ...
- Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)
上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...
- android如何在底部显示四个按钮,[Android系列—] 四. 添加操作栏(Action Bar)
[Android系列-] 4. 添加操作栏(Action Bar) 前言 操作栏是最重要的设计元素之一,使用它来实现你的应用程序活动.通过提供多种用户界面功能, 使应用程序快速和其他的Andorid应 ...
- android开发实验报告二,《Android 移动应用开发》实验报告-范本2(33页)-原创力文档...
实验1<Android活动的使用> 实验学时: 2 每组人数: 1 实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实 ...
- Java IO在Android中应用(二):APK加固
Java I/O在Android中应用(二):APK加固套壳 前言(废话) 我,有两把键盘,第一把是Poker III(黑轴),第二把是Poker II(红轴).工作的时候我常用的是红轴的Poker ...
- Android studio使用心得(二)— 打包签名apk发布
1.-–Android Studio菜单 Build->Generate Signed APK 2.--Create new.. 3.---跟eclipse里面一样,添加keystore 信 ...
最新文章
- 厦门口岸检出今年首例登革热病例
- html选择一个元素,css3选择第n个元素
- MATLAB点云处理:读取、展示、最近邻、ICP算法求取转移矩阵、旋转
- Nginx 内置绑定变量的介绍
- 技本功丨知否知否,Redux源码竟如此意味深长(下集)
- Nginx----原理
- MANIFEST.MF文件的编辑注意事项
- 「轻阅读」基于 Flink SQL CDC的实时数据同步方案,附视频教程
- Julia: Dates =DateFormat, format,parse.......
- 10.柱状图-----人口普查各地区人口排行榜
- 有人还原出了历史上的皇帝,朱元璋居然还挺帅?
- 雅猴的脚印——2019年下半年
- 基于机器学习进行销售预测分析
- Android 设置Switch样式
- 关于生僻字乱码的问题
- SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
- mysql 多表 left join_MySql left join 多表连接查询优化语句
- hadoop学习笔记(八):Java HDFS API
- Asp.Net MVC导出下载excel
- 突然觉得。。。好累!!!