You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何彻底阻止可选中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);
    }
}

为什么你的原有代码无效?

你之前的实现中:

  1. onCreateActionMode返回true会让ActionMode被初始化,哪怕你清空菜单并返回false在onPrepareActionMode,还是会显示一个空的操作栏;
  2. 没有处理上下文菜单的创建逻辑,所以长按选中文本时默认的上下文菜单依然会弹出。

内容的提问来源于stack exchange,提问作者Arman Hosseini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:32:53