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;
        }
    };
但是,如果用户启用了除Android默认设置之外的第三方键盘,则可能出现问题,该键盘可能具有复制/粘贴按钮或可能显示相同的上下文菜单.那么如何在该场景中禁用复制/粘贴?
如果还有其他方法可以复制/粘贴,请告诉我.(可能还有如何禁用它们)
任何帮助,将不胜感激.
Vic*_*dia 122
最好的方法是使用:
etUsername.setLongClickable(false);
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;
            }
        });
从onCreateActionMode(ActionMode,Menu)返回false将阻止启动操作模式(选择全部,剪切,复制和粘贴操作).
Ame*_*war 36
您可以通过禁用长按EditText来完成此操作
要实现它,只需在xml中添加以下行 -
android:longClickable="false"
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);
希望这对你有用 ;-)
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;
            }
        });
    }
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) {
        }
    }
}
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?) {}
    }
}
然后,您可以在您的上简单地调用此方法TextView:
override fun onCreate() {
    priceEditText.disableCopyPaste()
}
如果您不想禁用长按,是因为您需要对长按执行某些功能,而不是返回true是更好的选择。
您的edittext长按将是这样。
edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});
根据文档, 返回“ True”将表示已处理长按,因此无需执行默认操作。
我在API级别16、22和25上对此进行了测试。它对我来说很好用。希望这会有所帮助。
| 归档时间: | 
 | 
| 查看次数: | 87087 次 | 
| 最近记录: |