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

2020-01-07  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读