美文网首页Android开发
屏蔽应用内TextView Selection菜单

屏蔽应用内TextView Selection菜单

作者: 卓技卓品 | 来源:发表于2021-12-06 16:48 被阅读0次

    需求背景

    之前一篇文章《增加系统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菜单

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