下图左边效果为Context Menu右边效果为ActionMode。
ActionMode 其实就是替换在actionbar的位置上显示的一个控件。它跟actionbar一样,也是一种导航作用。只不过它可以根据情况需要,适当的显示跟隐藏。
下面我们就研究一下它的具体使用。
Context Menu是悬浮在操作项之上的视图;
ActionMode是临时占据了ActionBar的位置
下面给出ActionMode的实现方法。
使用ActionMode需要两步骤:
1、实现ActionMode.Callback接口,并处理ActionMode的生命周期,ActionMode的生命周期如下图:
private ActionMode.Callback mCallback = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { // TODO Auto-generated method stub } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.actionmode, menu); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { boolean ret = false; if (item.getItemId() == R.id.actionmode_cancel) { mode.finish(); ret = true; } return ret; } };
2、事件触发时,调用startActionMode()方法。
someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (mActionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
mActionMode = getActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
以上内容转载自:http://blog.csdn.net/xyz_lmn/article/details/12754785
下面我根据上面的知识点写个小demo,进行验证、总结
直接上代码
package com.example.alert; import android.R.anim; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; public class HeadSetActivity extends Activity { private ImageButton imageButton; private ActionMode actionMode; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageButton = (ImageButton) findViewById(R.id.bt); imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub actionMode = startActionMode(mCallback); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub menu.add(1, 2, 0, "aaa"); return super.onCreateOptionsMenu(menu); } private ActionMode.Callback mCallback = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub Log.e("123", "onPrepareActionMode"); return false; } @Override public void onDestroyActionMode(ActionMode arg0) { // TODO Auto-generated method stub //调用finish方法的时候,会执行这个函数(也就是actionMode消失的时候) Log.e("123", "onDestroyActionMode"); } @Override public boolean onCreateActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub Log.e("123", "onCreateActionMode"); //添加布局文件 ViewGroup v = (ViewGroup) LayoutInflater.from(HeadSetActivity.this) .inflate(R.layout.action_mode, null); arg0.setCustomView(v); //添加menu,如果内容过多,自动放到more 按钮里面,跟actionbar类似 MenuInflater inflater = arg0.getMenuInflater(); inflater.inflate(R.menu.main, arg1); //如果返回false,actionmode 不会显示 return true; } @Override public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) { // TODO Auto-generated method stub Log.e("123", "onActionItemClicked|item==="+arg1.getItemId()); //这个就是专门用来处理menu点击事件的 return false; } }; }
当我们点击按钮以及menu的时候
打印结果
1 09-23 15:56:09.335: E/123(314): onCreateActionMode 2 09-23 15:56:09.345: E/123(314): onPrepareActionMode 3 09-23 15:56:13.155: E/123(314): onDestroyActionMode 4 09-23 15:56:13.175: E/123(314): onCreateActionMode 5 09-23 15:56:13.175: E/123(314): onPrepareActionMode 6 09-23 15:56:17.215: E/123(314): onActionItemClicked|item===2131034175 7 09-23 15:56:20.215: E/123(314): onActionItemClicked|item===2131034176 8 09-23 15:56:21.215: E/123(314): onPrepareActionMode 9 09-23 15:56:22.815: E/123(314): onActionItemClicked|item===2131034180
效果图
从上面的打印结果我们知道,每一次启动startActionMode(),系统都会先销毁前一个。
如果我们想主动隐藏actionmode,我们可以使用
actionMode.finish();
方法