屏蔽应用内TextView Selection菜单

需求背景

之前一篇文章《增加系统TextView长按菜单》中,我们实现了对于系统中安装的各类应用内新增一条TextView长按菜单,实现自己应用功能的入口扩展。在应用开发者看来,该方式增加了应用的入口和曝光度,获取了流量的导入渠道。 站在使用者的角度,方便了部分操作,但同时也带了一些困扰。我自己为例,发现TextView长按菜单出现的实在太多了,包括:复制、剪切、全选、粘贴、分享、搜索(有多个)、翻译。挤在界面上,体验很不好。

作为以用户体验为基准的研发人员,肯定要考虑用户的使用感受。 我研究发现微信的长按复制菜单全部是自己定义的,和系统默认的菜单不同。那么显而易见,TextView长按菜单是可自定义的。 今天我们就研究一下如何实现自定义TextView(含EditText)长按菜单的显示。

实现过程

TextView中有setCustomSelectionActionModeCallback方法,来实现长按选中菜单的初始化和点击回调操作。看一下源码,setCustomSelectionActionModeCallback中参数为ActionMode.Callback2,内部可重写的方法分别为: onCreateActionMode:

Called when action mode is first created. The menu supplied will be used to generate action buttons for the action mode.

首次创建action模式时调用。提供的菜单将用于为action模式生成action按钮。

onPrepareActionMode:

Called to refresh an action mode's action menu whenever it is invalidated.

调用以在action模式失效时刷新操作模式的操作菜单。

onActionItemClicked:

Called to report a user click on an action button.

调用以报告用户单击action菜单按钮。

onDestroyActionMode:

Called when an action mode is about to be exited and destroyed.

当action模式即将退出和销毁时调用。

实际验证发现,只要onCreateActionMode方法返回false,那么长按选中文本时,不显示任何菜单项。 在此基础上,进行以下几种测试,分别为:

mTvShiciContent.setCustomSelectionActionModeCallback(new ActionMode.Callback2() {
  @Override
  public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    MenuInflater inflater = mode.getMenuInflater();
    menu.clear();
    inflater.inflate(R.menu.text_menu, menu);
    return true;
  }

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
  }

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    return false;
  }

  @Override
  public void onDestroyActionMode(ActionMode mode) {

  }
});

此时,菜单显示:全选、测试(text_menu中自定义)、搜索(浏览器)、翻译(华为翻译)、搜索(今日头条)。

mTvShiciContent.setCustomSelectionActionModeCallback(new ActionMode.Callback2() {
  @Override
  public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.text_menu, menu);
    return true;
  }

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    menu.clear();
    return false;
  }

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    return false;
  }

  @Override
  public void onDestroyActionMode(ActionMode mode) {

  }
});
···
此时,不显示任何菜单项。
···
mTvShiciContent.setCustomSelectionActionModeCallback(new ActionMode.Callback2() {
  @Override
  public boolean onCreateActionMode(ActionMode mode, Menu menu) {

    return true;
  }

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    menu.clear();
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.text_menu, menu);
    return false;
  }

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    return false;
  }

  @Override
  public void onDestroyActionMode(ActionMode mode) {

  }
});

此时,只显示自定义菜单:测试(text_menu中自定义)。

那么可以根据应用实际需要的模式进行设置即可。

你可能感兴趣的:(屏蔽应用内TextView Selection菜单)