Android之ContextMenu

基本步骤:
1、创建Menu
2、注册
3、创建ContextMenu:覆盖父类方法onCreateContextMenu
4、菜单项的操作:覆盖父类方法onContextItemSelected
5、为按钮设置上下文操作模式

一、创建Menu
1、在res文件夹中新建文件夹menu;
2、在menu文件夹中新建context.xml(文件名随意),文件内容如下,item就是menu菜单中的条目;

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/delete"
        android:title="删除" />
    <item android:title="重命名">
        <menu>
            <item
                android:id="@+id/opera1"
                android:title="操作1" />
            <item
                android:id="@+id/opera2"
                android:title="操作2" />
        </menu>
    </item>
</menu>

二、注册

registerForContextMenu(findViewById(R.id.ctx_btn));

三、创建ContextMenu:覆盖父类方法onCreateContextMenu

 @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        

四、菜单项的操作:覆盖父类方法onContextItemSelected

@Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.delete:
                Toast.makeText(this,"删除",Toast.LENGTH_SHORT).show();
                break;
            case R.id.opera1:
                Toast.makeText(this,"操作1",Toast.LENGTH_SHORT).show();
                break;
            case R.id.opera2:
                Toast.makeText(this,"操作2",Toast.LENGTH_SHORT).show();
                break;

        }
        return super.onContextItemSelected(item);
    }

五、为按钮设置上下文操作模式(可将步骤2、3、4代码注释)
【注:上下文操作模式是什么】
是ActionMode的一种系统实现,将用户的交互重点转到执行上下文操作来,当用户启动上下文操作模式时,在应用的顶部出现一个上下文操作栏,也就是我们常说的一个ActionBar,在这一个上下文操作栏里,会显示用户对于当前所要执行的各种操作

下面的操作显示结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200128223104737.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDM4MDU1,size_16,color_FFFFFF,t_7
1、实现ActiomMode CallBack

    ActionMode.Callback cb=new ActionMode.Callback() {
        //创建方法,在启动上下文操作模式时(startActionMode(Callback))调用
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            Log.d("TAG", "onCreateActionMode: 创建");
            getMenuInflater().inflate(R.menu.context,menu);
            return true;
        }

        //在创建方法后使用
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            Log.d("TAG", "onPrepareActionMode: 准备");
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            Log.d("TAG", "onActionItemClicked: 点击");
            switch (item.getItemId()){
                case R.id.delete:
                    Toast.makeText(MainActivity.this,"删除",Toast.LENGTH_SHORT).show();//因为这是在一个内部类里
                    break;
                case R.id.opera1:
                    Toast.makeText(MainActivity.this,"操作1",Toast.LENGTH_SHORT).show();
                    break;
                case R.id.opera2:
                    Toast.makeText(MainActivity.this,"操作2",Toast.LENGTH_SHORT).show();
                    break;

            }
            return true;
        }

        //上下文操作模式结束时被调用
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            Log.d("TAG", "onDestroyActionMode: 结束");
        }
    };

2、在view的长按事件中启动上下文操作模式

findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                startActionMode(cb);
                return false;
            }
        });
发布了34 篇原创文章 · 获赞 5 · 访问量 7494

猜你喜欢

转载自blog.csdn.net/qq_39438055/article/details/104102797