Android: как полностью отключить функцию копирования и вставки в Edittext
Я довольно новичок в области разработки Android, и недавно я столкнулся с серьезной проблемой.
Я пытался создать Edittext, который НЕ ПОЗВОЛИТ пользователю копировать контент или вставлять контент в него. Я много гуглил и обнаружил, что есть два популярных способа сделать это:
1-й способ, чтобы установить его в файле макета:
android:longClickable="false"
2-й способ, чтобы программно установить его:
myEdittext.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;
}
});
Но я только что обнаружил, что какой бы путь я не выбрал, область редактирования текста может быть отключена только при длительном нажатии, что затем не позволяет пользователю получить доступ к меню "выбрать все, скопировать и вставить" при длительном нажатии. Но оба решения не препятствовали пользователю получить доступ к функции "вставки" простым касанием курсора.
Поэтому мой вопрос: как я могу ПОЛНОСТЬЮ заблокировать пользователя от функции копирования и вставки в определенном тексте редактирования. Кто-нибудь помогает? Большое спасибо
4 ответа
Есть одна возможность, отключив обработчик курсора. Вы не получите кнопку вставки, но вы также не сможете перемещать курсор касанием.
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP && mDisableCursorHandle) {
// Hack to prevent keyboard and insertion handle from showing.
cancelLongPress();
}
return super.onTouchEvent(event);
}
Лучший программный способ это:
myEdittext.setLongClickable(false);
Или просто в xml
android:longClickable="false"
Вы можете полностью скрыть меню "выбрать все, скопировать и вставить", а также функцию "вставить", которая появляется при простом нажатии на курсор.
Для этого вам нужно создать собственный класс EditText. Вот пример...
// Custom EditText class
public class NoMenuEditText extends EditText
{
private final Context context;
/** This is a replacement method for the base TextView class' method of the same name. This
* method is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
boolean canPaste()
{
return false;
}
/** This is a replacement method for the base TextView class' method of the same name. This method
* is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
* appears when triggered from the text insertion handle. Returning false forces this window
* to never appear.
* @return false
*/
@Override
public boolean isSuggestionsEnabled()
{
return false;
}
public NoMenuEditText(Context context)
{
super(context);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
init();
}
public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context = context;
init();
}
private void init()
{
this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor());
this.setLongClickable(false);
}
/**
* Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing
* by intercepting the callback that would cause it to be created, and returning false.
*/
private class ActionModeCallbackInterceptor implements ActionMode.Callback
{
private final String TAG = NoMenuEditText.class.getSimpleName();
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) {}
}
}
Используйте этот EditText в вашем макете. Теперь он не будет отображать меню копирования / вставки. Он будет показывать только синий маркер, но когда вы нажмете на него, вы не получите всплывающее окно с возможностью вставки.
Надеюсь это поможет...
Решение очень простое
public class MainActivity extends AppCompatActivity {
EditText et_0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_0 = findViewById(R.id.et_0);
et_0.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
//to keep the text selection capability available ( selection cursor)
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
//to prevent the menu from appearing
menu.clear();
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
}
}