如何彻底阻止可选中TextView选中文本时显示操作菜单?
解决TextView选中文本时阻止操作栏和上下文菜单的问题
我明白你现在的困扰——明明设置了CustomSelectionActionModeCallback,但选中文本时操作栏和上下文菜单还是冒出来了对吧?问题出在你当前实现的回调逻辑和遗漏的上下文菜单处理上,咱们来调整一下就能彻底解决:
核心解决方案
要同时干掉操作栏和上下文菜单,需要从两个维度处理:阻止ActionMode(顶部操作栏)的创建,以及阻止默认上下文菜单的弹出,同时保留文本选中功能。
方法1:直接给现有TextView设置回调和监听器
// 先确保TextView支持文本选中 tv.setTextIsSelectable(true); // 处理顶部操作栏(ActionMode):直接阻止其创建 tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // 返回false,彻底阻止ActionMode初始化,操作栏就不会显示 return false; } @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) { } }); // 处理长按弹出的上下文菜单:阻止默认菜单创建 tv.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { // 什么都不做,直接跳过默认上下文菜单的创建逻辑 } });
方法2:自定义TextView(更优雅,适合多处复用)
如果你的项目中多个地方需要这种无菜单的可选中TextView,可以自定义一个:
public class NoMenuSelectableTextView extends androidx.appcompat.widget.AppCompatTextView { public NoMenuSelectableTextView(Context context) { super(context); init(); } public NoMenuSelectableTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public NoMenuSelectableTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setTextIsSelectable(true); // 阻止ActionMode创建 setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; } @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) { } }); } @Override protected void onCreateContextMenu(ContextMenu menu) { // 不调用父类方法,直接阻止默认上下文菜单生成 // super.onCreateContextMenu(menu); } }
为什么你的原有代码无效?
你之前的实现中:
onCreateActionMode返回true会让ActionMode被初始化,哪怕你清空菜单并返回false在onPrepareActionMode,还是会显示一个空的操作栏;- 没有处理上下文菜单的创建逻辑,所以长按选中文本时默认的上下文菜单依然会弹出。
内容的提问来源于stack exchange,提问作者Arman Hosseini
相关产品推荐
相关产品推荐

