Нужно специальное всплывающее окно для долгого касания EditText вместо ActionMode
Для долгого касания EditText, я бы хотел пользовательскую панель действий. За исключением случаев, когда панель действий появляется в верхней части экрана, мне нужно контролировать ее положение. Я также хотел бы добавить несколько пользовательских кнопок (но это, вероятно, самая легкая часть).
Да, я понимаю, что нарушаю правила Android.
Создать всплывающее окно и позиционировать его достаточно просто. Сложная часть заключается в том, чтобы сохранить поведение выделения текста в EditText, чтобы при длительном касании текст выбирался в соответствии со стандартным поведением.
Я пробовал ряд экспериментов, каждый из которых потерпел неудачу по той или иной причине:
Используйте setCustomSelectionActionModeCallback и возвращайте "false" в его onCreateActionMode(). Это предотвращает появление панели действий, но также предотвращает длительное касание выбора текста.
Продолжая с № 1, я попытался создать подкласс EditText и включить мой собственный метод onTouch. В onTouch я подумал, что это может помочь добавить некоторую логику в ACTION_UP. Два варианта:
Всегда возвращая false от ACTION_UP. EditText тогда никогда не видит ACTION_UP и рассматривает каждое касание как длинное касание. Таким образом, нет позиционирования курсора.
Разрешить EditText для получения ACTION_UP, но в случае длительного касания, опубликовать функцию, чтобы установить выбор. В некоторых случаях это работает, но в других случаях он просто устанавливает курсор в одном месте и не выделяет выделение. Другими словами, setSelection() ломается.
Я пробовал незначительные варианты вышеупомянутого. Пока ничего не работает. И даже если что-то работает, это, вероятно, очень хрупкое решение, которое может сломаться при следующей ревизии Android в EditText.
Любые идеи приветствуются!
1 ответ
Используйте этот код:
/*If your finger is pressed for more than 1 second, activated */
EditText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//Do whatever you want
return true;
}
});