【问题标题】:Remove menu options from Contextual Action Bar从上下文操作栏中删除菜单选项
【发布时间】:2016-12-06 08:13:59
【问题描述】:

在 android 文本视图中选择文本时,上下文操作栏会出现复制、剪切、全选、共享等选项。有没有办法在我的应用中删除其中一些选项?

【问题讨论】:

    标签: android contextual-action-bar


    【解决方案1】:

    您可以扩充自己的菜单,然后隐藏操作系统插入的所有项目。

    首先,跟踪菜单项的所有 ID:

    List<Integer> mOptionsList = new ArrayList<Integer>();
    
    /* put these two lines in onCreate() */
    mOptionsList.add(R.id.my_option_1);
    mOptionsList.add(R.id.my_option_2);
    

    然后,在 onPrepare 中隐藏任何不属于您的 MenuItem:

    private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
    
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.my_contectual_menu, menu);
            return true;
        }
    
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            for (int i = 0; i < menu.size(); i++) {
                MenuItem item = menu.getItem(i);
                if (!mOptionsList.contains(item.getItemId()))
                    item.setVisible(false);
            }
            return false;
        }
    
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case R.id.my_option_1: {
                    /* do something for option 1 */
                    break;
                }
                case R.id.my_option_2: {
                    /* do something for option 2 */
                    break;
                }
                default:
                    return false;
            }
        }
    
        public void onDestroyActionMode(ActionMode mode) {}
    };
    

    【讨论】:

    • my_contectual_menu 包含什么?这不会在没有任何系统内容的情况下膨胀我们自己的菜单吗?那么在 onPrepareActionMode 中移除项目有什么意义呢?
    • 这是您菜单的资源。默认情况下,操作系统会扩展您的菜单,但会将其与系统菜单合并。这就是为什么我要隐藏不属于我的物品。
    • 我创建了自己的菜单,但是 CAB 只包含我在资源文件中添加的项目。它没有任何系统的东西。这就是在 onPrepareActionMode 函数中没有做任何事情。
    • 知道为什么它不合并系统菜单项吗?
    • 这是保证适用于所有设备的正确解决方案。在我的带有 Android 6.0 的 Z5 中,它正在将系统默认菜单项与我自己的菜单合并,即使在 onCreateActionMode 中我执行了 menu.clear()。谢谢@Krylez
    【解决方案2】:

    如果要清除默认图标,只需使用 menu.clear()。例如修改上面的代码,我们有 私有 ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        menu.clear;
        ...
    
        return true;
    }
    

    要删除特定图标,您需要拥有该图标的 id。可能是 menu.removeItem(android.R.id.copy) 之类的。

    【讨论】:

    • 它应该在 Android 11 中工作吗?我在模拟器中试过了,但是没有去掉“智能”项,我认为是系统在认为必要的时候会添加的,例如选择文本为地址时的“地图”菜单,或者“翻译” " 所选文本为外语时的菜单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2014-10-31
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多