需求背景
之前一篇文章《增加系统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中自定义)。
那么可以根据应用实际需要的模式进行设置即可。
网友评论