先直观的看看什么是上下文操作栏
这是来自android developer的原图,左边是Float menu,也就是原来的Context Menu,后边的就是我们要说的Contextual ActionBar,原文中叫Contextual Action Mode,由于操作按钮都是出现在ActionBar的位置,所以直接叫Contextual ActionBar好了。
Context Menu和Contextual ActionBar(以下简称CAB)与activity的菜单OptionMenu相比,不同就在于前两个是针对View的,可以为每个View添加相应的Context Menu和CAB,但是OptionMenu是针对整个Activity的。
前几天遇到一个面试的人,随口聊起来ActionBar,没想到那个人说自己从来不用ActionBar,从来都是自己实现一个Layout放在顶部,然后聊了ActionBar的其他一些特性,果然既不懂又不服。感觉很多人对ActionBar还是有一些误解,认为就是一个顶部的导航栏,其实ActionBar还有很多不错的用途,CAB就是其中一个。
本文主要是结合android developer文档写的,喜欢读英文的可以直接进入传送门Menus。
CAB是为了处理用户一连串动作,比如一个用户可能看到一段文字,觉得很好,就会想给分享给别人或者保存下来,当用户选中文字后,就可以出现CAB,CAB上包含分享按钮、复制按钮,让用户进行分享或者保存动作。
一般Contextual ActionBar都是监听View的LongClick事件,也就是长按组件出现CAB。
对于普通的View,比如Button、TextView等,一般实现可以简化为三步。
1、xml中实现menu
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_share" android:title="@string/share" android:icon="?attr/menuIconShare" android:showAsAction="always|withText" /> </menu>
class ActionBarCallBack implements ActionMode.Callback{ @Override public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) { // TODO Auto-generated method stub //这里是对Contextual item的处理 return false; } @Override public boolean onCreateActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub //这里是关键 arg0.getMenuInflater().inflate(R.menu.main_context_menu, arg1); return true; } @Override public void onDestroyActionMode(ActionMode arg0) { // TODO Auto-generated method stub } @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub return false; } }
tv = (TextView) rootView.findViewById(R.id.fragment_main_tv); tv.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // TODO Auto-generated method stub mContext.startSupportActionMode(mContext.new ActionBarCallBack()); return false; } });在onLongClick中调用startSupportActionMode(为了兼容,或者startActionMode),把第2步的Action.Call对象作为参数。
这样,长按view就会出现Contextual ActionBar,