最近实现个功能,展示一段文本,支持用户长按选择复制文本。使用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
网友评论