Android的menu有多种实现方式,Action Mode是Android 3.0以后出现的,我们可以使用AppCompat库使Action Mode兼容至Android 2.1。

Android 3.0以前,我们处理列表的长按事件经常使用Context Menu,Android3.0以后,我们有了新的选择:Action Mode。下图左边效果为Context Menu右边效果为Action Mode。




Android开发者应该都熟悉Context Menu了,Context Menu是悬浮在操作项之上的视图。Action Mode是临时占据了ActionBar的位置。


关于Action Mode详细资料:http://developer.android.com/guide/topics/ui/menus.html#context-menu

自己写了一个示例以增强记忆运行效果如下:

在TextView上使用Contextual Action Mode







在ListView上使用Contextual Action Mode





1、在单个View上使用Contextual Action Mode

package com.example.cabtest;import android.annotation.SuppressLint;import android.app.ActionBar;import android.app.Activity;import android.content.Intent;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 IndividualviewsCAMActivity extends Activity {private ActionMode mActionMode;@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_individual);super.onCreate(savedInstanceState);ActionBar mActionBar = getActionBar();mActionBar.setDisplayHomeAsUpEnabled(true);mActionBar.setDisplayUseLogoEnabled(true);findView();}@SuppressLint("NewApi")private void findView() {String content = "北京时间12月5日消息,据国外科技网站BusinessInsider报道,日前,美国麻省理工学院(MIT)有形媒体小组的一个研究团队研发出了一种新的人机交互技术——人类可以进入电脑进行远程的物理操作。该技术现在只能模拟非常基本的动作,比如击掌或是来回拍球。而在未来,一个更复杂的版本或许能够在更大的屏幕上工作,并重现整个人体。";TextView tv_content = (TextView) findViewById(R.id.tv_content);tv_content.setText(content);tv_content.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {if (mActionMode != null) {return false;}mActionMode = IndividualviewsCAMActivity.this.startActionMode(mActionModeCallback);v.setSelected(true);return true;}});}@SuppressLint("NewApi")private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {// Inflate a menu resource providing context menu itemsMenuInflater inflater = mode.getMenuInflater();inflater.inflate(R.menu.context_menu_individual, menu);return true;}@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {switch (item.getItemId()) {case R.id.menu_copy:Toast.makeText(getApplicationContext(), R.string.menu_copy,Toast.LENGTH_SHORT).show();mode.finish(); // Action picked, so close the CABreturn true;case R.id.menu_delete:Toast.makeText(getApplicationContext(), R.string.menu_delete,Toast.LENGTH_SHORT).show();mode.finish(); // Action picked, so close the CABreturn true;default:return false;}}@Overridepublic void onDestroyActionMode(ActionMode mode) {mActionMode = null;}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.context_menu_test, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:// app icon in action bar clicked; go homeIntent intent = new Intent(this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);return true;default:return super.onOptionsItemSelected(item);}}}


context_menu_individual.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >        <item        android:id="@+id/menu_copy"        android:icon="@drawable/ic_copy"        android:orderInCategory="1"        android:showAsAction="always"        android:title="@string/menu_copy"/>        <item        android:id="@+id/menu_delete"        android:icon="@drawable/ic_delete"        android:orderInCategory="2"        android:showAsAction="always"        android:title="@string/menu_delete"/></menu>



2、在ListView/GridView 上使用Contextual Action Mode

package com.example.cabtest;import java.util.ArrayList;import java.util.List;import com.example.cabtest.entity.Book;import android.app.ActionBar;import android.app.Activity;import android.content.Intent;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.ViewGroup;import android.widget.AbsListView.MultiChoiceModeListener;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class ListCAMActivity extends Activity {private List<Book> mList = new ArrayList<Book>();private List<Book> checkedList = new ArrayList<Book>();private BookAdapter mAdapter;private ListView mListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_list);super.onCreate(savedInstanceState);ActionBar mActionBar = getActionBar();mActionBar.setDisplayHomeAsUpEnabled(true);mActionBar.setDisplayUseLogoEnabled(true);initData();findView();}private void initData() {for (int i = 0; i < 40; i++) {Book book = new Book();book.setId(i);book.setName("Thinking In Java " + i);mList.add(book);}}private void findView() {mListView = (ListView) findViewById(R.id.mListView);mAdapter = new BookAdapter();mListView.setAdapter(mAdapter);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 CABBook book = mList.get(position);if (checked) {book.setChecked(true);checkedList.add(book);} else {checkedList.remove(book);book.setChecked(false);}if (mAdapter != null) {mAdapter.notifyDataSetChanged();}setSubtitle(mode);}private void setSubtitle(ActionMode mode) {int checkedCount = checkedList.size();// int checkedCount = mListView.getCheckedItemCount();switch (checkedCount) {case 0:mode.setSubtitle(null);break;default:mode.setSubtitle("选择了" + checkedCount + "项");break;}}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {// Respond to clicks on the actions in the CABswitch (item.getItemId()) {case R.id.menu_delete:mList.removeAll(checkedList);if (mAdapter != null) {mAdapter.notifyDataSetChanged();}Toast.makeText(getApplicationContext(),R.string.menu_delete, Toast.LENGTH_SHORT).show();checkedList.clear();mode.finish(); // Action picked, so close the CABreturn true;case R.id.menu_edit:Toast.makeText(getApplicationContext(), R.string.menu_edit,Toast.LENGTH_SHORT).show();mode.finish(); // Action picked, so close the CABreturn true;case R.id.menu_detail:Toast.makeText(getApplicationContext(),R.string.menu_detail, Toast.LENGTH_SHORT).show();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_menu_list, 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 class BookAdapter extends BaseAdapter {@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = View.inflate(getApplicationContext(),R.layout.list_item, null);holder = new ViewHolder();holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}Book book = mList.get(position);if(book.isChecked()){convertView.setBackgroundColor(getResources().getColor(R.color.blur));}else{convertView.setBackgroundColor(getResources().getColor(R.color.white));}holder.tv_name.setText(book.getName());return convertView;}}static class ViewHolder {TextView tv_name;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.context_menu_test, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:// app icon in action bar clicked; go homeIntent intent = new Intent(this, MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);return true;default:return super.onOptionsItemSelected(item);}}}


context_menu_list.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/menu_delete"        android:icon="@drawable/ic_delete"        android:orderInCategory="1"        android:showAsAction="always"        android:title="@string/menu_delete"/>        <item        android:id="@+id/menu_edit"        android:icon="@drawable/ic_edit"        android:orderInCategory="2"        android:showAsAction="always"        android:title="@string/menu_edit"/>        <item        android:id="@+id/menu_detail"        android:icon="@drawable/ic_detail"        android:orderInCategory="3"        android:showAsAction="always"        android:title="@string/menu_detail"/></menu>


list_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical" >        <TextView        android:id="@+id/tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="18sp"        android:layout_gravity="center_vertical"        android:layout_margin="10dp"        android:textColor="@color/black"/></LinearLayout>


context_menu_test.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/menu_refresh"        android:icon="@drawable/ic_action_refresh"        android:orderInCategory="1"        android:showAsAction="always"        android:title="@string/menu_refresh"/>        <item        android:id="@+id/menu_search"        android:icon="@drawable/ic_action_search"        android:orderInCategory="2"        android:showAsAction="always"        android:title="@string/menu_search"/></menu>





Demo下载地址:http://download.csdn.net/detail/fx_sky/6663421






更多相关文章

  1. Android缓冲进度条或加载进度条
  2. LinearLayout半透明效果
  3. Java小白入门第十四弹移动操作系统编写
  4. Android高手进阶教程(十)-----Android(安卓)PopupWindow的使用!!
  5. ViewPage滑动加载大图和点击关注效果《IT蓝豹》
  6. Android(安卓)ExpandableListView折叠
  7. Android(安卓)ListView动画(逐行显示动画效果)
  8. Android实现蒙板效果
  9. Android:如何给ScrollView添加滑块滚动条

随机推荐

  1. android 点击获取验证码显示倒计时并不可
  2. Android(安卓)系统启动流程总结
  3. apk、dex、odex梳理
  4. Android(安卓)Studio使用技巧
  5. android view滑动的几种方法
  6. Android(安卓)Fragment与Fragment、Activ
  7. Android(安卓)开机自动启动服务
  8. Android(安卓)ViewGroup中addView方法使
  9. android 端拍照并运用Tesseract OCR 识别
  10. Android(安卓)- UI(User Interface)的基