如何禁用从/到EditText的复制/粘贴

rDr*_*oid 118 android android-widget android-keypad android-edittext

在我的应用程序中,有一个注册屏幕,我不希望用户能够将文本复制/粘贴到该EditText字段中.我已经设置了onLongClickListener每个,EditText以便显示复制/粘贴/输入方法和其他选项的上下文菜单不显示.因此,用户将无法复制/粘贴到"编辑"字段中.

 OnLongClickListener mOnLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // prevent context menu from being popped up, so that user
            // cannot copy/paste from/into any EditText fields.
            return true;
        }
    };
Run Code Online (Sandbox Code Playgroud)

但是,如果用户启用了除Android默认设置之外的第三方键盘,则可能出现问题,该键盘可能具有复制/粘贴按钮或可能显示相同的上下文菜单.那么如何在该场景中禁用复制/粘贴?

如果还有其他方法可以复制/粘贴,请告诉我.(可能还有如何禁用它们)

任何帮助,将不胜感激.

Vic*_*dia 122

最好的方法是使用:

etUsername.setLongClickable(false);
Run Code Online (Sandbox Code Playgroud)

  • 或者,只是在xml`android:longClickable ="false"`:) (54认同)
  • 点击蓝色光标指示灯时会出现粘贴按钮. (19认同)
  • 这肯定会阻止视图长时间点击,但也可以通过双击文本来请求编辑控件,这意味着此解决方案不完整.为了您的目的,请记住这一点. (15认同)
  • 此外,键盘快捷键仍然可以使用 (Ctrl+C) 使用外部键盘。 (2认同)

Zai*_*Ali 108

如果您使用的是API级别11或更高级别,则可以停止显示复制,粘贴,剪切和自定义上下文菜单.

edittext.setCustomSelectionActionModeCallback(new ActionMode.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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

从onCreateActionMode(ActionMode,Menu)返回false将阻止启动操作模式(选择全部,剪切,复制和粘贴操作).

  • 不适合我.点击蓝色光标指示灯时会出现按钮. (22认同)
  • 也不适合我.在双击时,显示复制粘贴菜单. (8认同)

Ame*_*war 36

您可以通过禁用长按EditText来完成此操作

要实现它,只需在xml中添加以下行 -

android:longClickable="false"
Run Code Online (Sandbox Code Playgroud)

  • 问题是我的应用程序用户有一个第三方键盘,它有一个复制和粘贴按钮. (6认同)
  • 另一个问题是您可以通过双击选择文本,然后再次显示复制/粘贴 (2认同)

Jos*_*son 34

我能够通过以下方式禁用复制和粘贴功能:

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

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

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

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

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);
Run Code Online (Sandbox Code Playgroud)

希望这对你有用 ;-)

  • 此选项会阻止复制,但您仍然可以通过单击光标进行粘贴。 (2认同)

Har*_*dik 12

这是在所有版本中禁用editText剪切复制粘贴的最佳方法

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)


CJB*_*JBS 10

除了setCustomSelectionActionModeCallback禁用的长按解决方案之外,还需要防止在单击文本选择句柄时出现PASTE/REPLACE菜单,如下图所示:

带粘贴菜单的文本选择手柄

解决方案在于防止PASTE/REPLACE菜单出现在show()(未记录的)android.widget.Editor类的方法中.在菜单出现之前,进行检查if (!canPaste && !canSuggest) return;.用作设置这些变量的基础的两个方法都在EditText类中:

一个更完整的答案是可以在这里找到.


Wat*_*ter 7

使用其他解决方案,API 26(Oreo)仍然可以通过单击输入的文本来显示光标句柄,然后可以显示菜单。只有解决方案的组合才能解决我的问题。

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

    /**
    * This method sets TextView#Editor#mInsertionControllerEnabled field to false
    * to return false from the Editor#hasInsertionController() method to PREVENT showing
    * of the insertionController from EditText
    * The Editor#hasInsertionController() method is called in  Editor#onTouchUpEvent(MotionEvent event) method.
    */
    private void setInsertionDisabled() {
        try {
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editorObject = editorField.get(this);

            Class editorClass = Class.forName("android.widget.Editor");
            Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled");
            mInsertionControllerEnabledField.setAccessible(true);
            mInsertionControllerEnabledField.set(editorObject, false);
        }
        catch (Exception ignored) {
            // ignore exception here
        }
    }

    @Override
    public boolean isSuggestionsEnabled() {
        return false;
    }

    private class BlockedActionModeCallback implements ActionMode.Callback {
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

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

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

        public void onDestroyActionMode(ActionMode mode) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*ndr 6

Kotlin解决方案:

fun TextView.disableCopyPaste() {
    isLongClickable = false
    setTextIsSelectable(false)
    customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在您的上简单地调用此方法TextView

override fun onCreate() {
    priceEditText.disableCopyPaste()
}
Run Code Online (Sandbox Code Playgroud)


mua*_*uak 5

如果您不想禁用长按,是因为您需要对长按执行某些功能,而不是返回true是更好的选择。

您的edittext长按将是这样。

edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});
Run Code Online (Sandbox Code Playgroud)

根据文档, 返回“ True”将表示已处理长按,因此无需执行默认操作。

我在API级别16、22和25上对此进行了测试。它对我来说很好用。希望这会有所帮助。

  • 不错的。或者,只需在 XML 中设置 `android:longClickable="false"` (3认同)