如何禁用Android EditText中的粘贴选项

5
我有一个需求,需要禁止EditText的粘贴功能,但仍需保留复制功能。我尝试使用setCustomSelectionActionModeCallback方法,但这样会禁用复制选项。
EditText  etxt = (EditText) findViewById(R.id.editText1);
etxt.setCustomSelectionActionModeCallback(new Callback() {
             
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }
 
            public void onDestroyActionMode(ActionMode mode) {                  
            }
 
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }
 
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });

你是如何实现的? - Arash GM
请发布您尝试过的代码。 - Mike M.
1
可能是重复的问题,参考链接:https://dev59.com/3W015IYBdhLWcg3w_Q0_#12331404 - dharmendra
1
@dhams:这应该禁用复制和粘贴,问题是只禁用粘贴功能。 - Born To Win
请按照以下方式禁用EditText上下文菜单: https://dev59.com/ylgR5IYBdhLWcg3wJqi7 - vicky
3个回答

2

我自己完成了这个操作,感谢Android拦截editText上的粘贴\复制\剪切提供的帮助。

我根据我的需求改变了onTextContextMenuItem()函数。

@Override
    public boolean onTextContextMenuItem(int id) {
        // Do your thing:
        //boolean consumed = super.onTextContextMenuItem(id); // Change1
        // React:
        switch (id){
            case android.R.id.cut:
                onTextCut();
                break;
            case android.R.id.paste:
                onTextPaste();
                return false;       //Change2
                //break;
            case android.R.id.copy:
                onTextCopy();
        }
        return true; // Change3
    }

0
如果您想禁用粘贴选项,我认为最好是删除“粘贴上下文菜单”项,这是我在我的应用程序中实现此功能的一个实用方法(我还删除了剪切项)。
    public static void toggleContextMenuType(EditText editText) {

    if (editText.getCustomSelectionActionModeCallback() == null) {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                menu.removeItem(16908322);
                menu.removeItem(16908320);
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
            }
        });
    }else{
        editText.setCustomSelectionActionModeCallback(null);
    }
}

不要将ID的整数值硬编码,使用Android常量:android.R.id.paste(16908322),android.R.id.cut(16908320) - Dmitry K

0
如果您使用的是 11 或以上的 API 级别,请使用此方法。
      edittext.setCustomSelectionActionModeCallback(new Callback() {

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

        public void onDestroyActionMode(ActionMode mode) {                  
        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }
    });

你应该向 OP 演示如何使用它。 - Mike M.
你的意思是什么?这对我有效,只需获取EditText的ID并执行上述代码即可 :) - Maxwell
弹出什么菜单? - Mike M.
5
我认为上述代码将限制复制和粘贴功能。但是@surendra只想禁用粘贴而不是复制操作。 - Born To Win

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接