Нужно специальное всплывающее окно для долгого касания EditText вместо ActionMode

Для долгого касания EditText, я бы хотел пользовательскую панель действий. За исключением случаев, когда панель действий появляется в верхней части экрана, мне нужно контролировать ее положение. Я также хотел бы добавить несколько пользовательских кнопок (но это, вероятно, самая легкая часть).

Да, я понимаю, что нарушаю правила Android.

Создать всплывающее окно и позиционировать его достаточно просто. Сложная часть заключается в том, чтобы сохранить поведение выделения текста в EditText, чтобы при длительном касании текст выбирался в соответствии со стандартным поведением.

Я пробовал ряд экспериментов, каждый из которых потерпел неудачу по той или иной причине:

  1. Используйте setCustomSelectionActionModeCallback и возвращайте "false" в его onCreateActionMode(). Это предотвращает появление панели действий, но также предотвращает длительное касание выбора текста.

  2. Продолжая с № 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;
    }
});
Другие вопросы по тегам