TextView:如何防止在选择 TextView 中的文本时显示操作菜单?

huangapple 未分类评论49阅读模式
标题翻译

TextView: How to prevent displaying the action menu when selecting text in TextView?

问题

我有一个可选的 TextView。
我想在选择文本时阻止显示上下文菜单。

我实现了以下代码,但仍然显示操作栏和上下文菜单。

tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // 返回 true 以确保 yourTextView 仍然可选
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // 清除所有操作项,以提供无操作模式的选择
        menu.clear();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {

    }
});

如何永久移除它?

英文翻译

I have a selectable TextView.
I want to prevent showing the context menu when selecting text.

I implemented this code but action bar and context menu still is displayed.

   tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            // Return true to ensure the yourTextView is still selectable
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // Remove all action items to provide an actionmode-less selection
            menu.clear();
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {

        }
    });

How can it be remove forever?

答案1

得分: 0

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    menu.removeItem(android.R.id.selectAll);
    menu.removeItem(android.R.id.cut);
    menu.removeItem(android.R.id.copy);
    menu.removeItem(android.R.id.paste);
    menu.removeItem(android.R.id.replaceText);
    menu.removeItem(android.R.id.shareText);
    return true;
}
尝试手动从菜单中移除项目我希望现在应该可以工作了
英文翻译
@Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            menu.removeItem(android.R.id.selectAll);
            menu.removeItem(android.R.id.cut);
            menu.removeItem(android.R.id.copy);
            menu.removeItem(android.R.id.paste);
            menu.removeItem(android.R.id.replaceText);
            menu.removeItem(android.R.id.shareText);
            return true;
        }

Try to manually remove item from the menu. I hope it should work now.

答案2

得分: 0

我思考后最终写下了以下的代码:

tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        removeActionBar(getWindow().getDecorView());
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {

    }
});

private void removeActionBar(View v) {
    ViewGroup viewgroup = (ViewGroup) v;

    for (int i = 0; i < viewgroup.getChildCount(); i++) {
        View v1 = viewgroup.getChildAt(i);
        if (v1 instanceof ViewGroup)
            removeActionBar(v1);
        if (v1 instanceof ActionBarContextView) {
            viewgroup.removeView(v1);
        }
    }
}
英文翻译

I thought and finally wrote the following code:

    tv.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            removeActionBar(getWindow().getDecorView());
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {

        }
    });

    private void removeActionBar(View v) {
            ViewGroup viewgroup = (ViewGroup) v;

            for (int i = 0; i &lt; viewgroup.getChildCount(); i++) {
                    View v1=viewgroup.getChildAt(i);
                    if ( v1 instanceof ViewGroup )
                            removeActionBar(v1);
                    if ( v1 instanceof ActionBarContextView ) {
                            viewgroup.removeView(v1);
                    }
            }
    }

huangapple
  • 本文由 发表于 2020年5月30日 21:04:14
  • 转载请务必保留本文链接:https://java.coder-hub.com/62102838.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定