• 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();

    方法

     
  • 相关阅读:
    win10 免费屏幕录像工具下载
    普通人如何在“元宇宙”中获取红利?
    CMake语法—函数(定义&调用)
    CMake语法—普通变量与子目录(Normal Variable And Subdirectory)
    CMake语法—函数(解析参数 PARSE_ARGV)
    算法set_intersection、set_union、set_difference
    CMake语法—缓存变量(Cache Variable)
    C++ 求时差
    CMake语法—环境变量(Environment Variable)
    CMake语法—普通变量与函数(Normal Variable And Function)
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_menu_150315230.html
Copyright © 2020-2023  润新知