美文网首页
TextView支持长按出现菜单及菜单定制

TextView支持长按出现菜单及菜单定制

作者: 孤舟一夜大侠 | 来源:发表于2020-01-07 12:00 被阅读0次

    最近实现个功能,展示一段文本,支持用户长按选择复制文本。使用TextView来实现,只需要设置下面属性即可支持:

    android:textIsSelectable="true"
    

    当长按文本会,在Vivo手机上会出现弹出式菜单如下:

    弹出菜单.png

    可以看到弹出的菜单,出现了“剪贴板”、“网页搜索”等我们并不需要的菜单项,那么如何清除掉不需要的菜单项呢?

    textView支持setCustomSelectionActionModeCallback方法设置文本选择操作回调,在onPrepareActionMode回调方法里,把不需要的菜单项remove掉即可:

     private void removeClipboardMenu() {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                mTextView.setCustomSelectionActionModeCallback(new ActionMode.Callback2() {
                    @Override
                    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                        return true;//返回false则不会显示弹窗
                    }
    
                    @Override
                    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                        if (menu != null && menu.size() > 0) {
                            for (int i = 0; i < menu.size(); i++) {
                                MenuItem item = menu.getItem(i);
                                if ("剪贴板".equals(item.getTitle().toString())) {
                                    menu.removeItem(item.getItemId());
                                }
                            }
                        }
                        return false;
                    }
    
                    @Override
                    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                        return false;//返回true则系统item将无效,只有自定义item有响应
                    }
    
                    @Override
                    public void onDestroyActionMode(ActionMode mode) {
                    }
                });
            }
        }
    

    另外,在onPrepareActionMode回调方法里,还可以remove掉所以的系统菜单项,并替换为我们自己定义的菜单。首先,我们先在res下的menu文件夹里新建一个菜单文件,我把它命名为selection_action_menu.xml,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/Informal22"
            android:title="自定义22" />
        <item
            android:id="@+id/Informal33"
            android:title="自定义33" />
    </menu>
    

    然后,重写onPrepareActionMode回调方法:

     @Override
      public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
             MenuInflater menuInflater = actionMode.getMenuInflater();
             menu.clear();
             menuInflater.inflate(R.menu.selection_action_menu,menu);
             return true;
      }
    

    并在onActionItemClicked中处理点击事件:

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            //根据item的ID处理点击事件
            switch (menuItem.getItemId()){
                case R.id.Informal22:
                    Toast.makeText(MainActivity.this, "点击的是22", Toast.LENGTH_SHORT).show();
                    actionMode.finish();//收起操作菜单
                    break;
                case R.id.Informal33:
                    Toast.makeText(MainActivity.this, "点击的是33", Toast.LENGTH_SHORT).show();
                    actionMode.finish();
                    break;
            }
            return false;//返回true则系统的"复制"、"搜索"之类的item将无效,只有自定义item有响应
        }
    

    最后,长按TextView之后,弹出的菜单只会出现我们指定的菜单项:


    保留指定菜单项.png

    相关文章

      网友评论

          本文标题:TextView支持长按出现菜单及菜单定制

          本文链接:https://www.haomeiwen.com/subject/mnjractx.html