actionmode-ActionMode以及它的menu使用

下图左边效果为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();

方法

 
原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_menu_150315230.html