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)
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将阻止启动操作模式(选择全部,剪切,复制和粘贴操作).
Ame*_*war 36
您可以通过禁用长按EditText来完成此操作
要实现它,只需在xml中添加以下行 -
android:longClickable="false"
Run Code Online (Sandbox Code Playgroud)
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)
希望这对你有用 ;-)
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类中:
isSuggestionsEnabled()是公开的,因此可能被覆盖.canPaste()不是,因此必须通过在派生类中引入相同名称的函数来隐藏它.一个更完整的答案是可以在这里找到.
使用其他解决方案,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)
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)
如果您不想禁用长按,是因为您需要对长按执行某些功能,而不是返回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上对此进行了测试。它对我来说很好用。希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
87087 次 |
| 最近记录: |