Подтвердить что ты не робот

Переопределение панели контекстных действий по умолчанию для выбора текста (в WebView) на Android

Я хочу переопределить существующую панель контекстных действий по умолчанию (CAB) для выбора текста. Я имею в виду, я хочу отображать свою собственную CAB с моими собственными кнопками, когда в webview выбран какой-то текст. Я попробовал реализовать CAB, используя Android Documentation. OnLongClickListener не отображает событие выбора текста в веб-представлении. Какое событие захватывает выбор текста? Можно ли скрыть CAB по умолчанию и отобразить мою CAB по выбору текста?

childWebView.setOnLongClickListener(new OnLongClickListener() {
        @Override
     // Called when the user long-clicks on someView
        public boolean onLongClick(View view) {
            if (mActionMode != null) {
                return false;
            }

            // Start the CAB using the ActionMode.Callback defined above
            mActionMode = startActionMode(mActionModeCallback);
            view.setSelected(true);
            return true;
        }
    });
4b9b3361

Ответ 1

Я смог решить это. Я также столкнулся с этой проблемой и не нашел решения в Интернете.

Итак, если вы настроили прослушиватель LongClick, Webview перестанет показывать выбор вообще. После глубокого углубления в код Webview я обнаружил, что он вызывает метод WebView startRunMode и передает экземпляр класса SelectActionCallbackMode.

Я просто расширил класс Webview и переопределил метод startRunMode следующим образом:

public ActionMode startActionMode(ActionMode.Callback callback) 
{
    actionModeCallback = new CustomizedSelectActionModeCallback();
    return super.startActionMode(actionModeCallback);
}

Это вынудило Webview отображать мой обратный вызов вместо того, чтобы отображать по умолчанию Webview. Это обеспечило, чтобы выбор работал так же гладко, как и раньше, и мой CAB отображался каждый раз, когда был сделан выбор. Единственное предостережение заключалось в том, что я должен был написать код, чтобы сам КАБ.

Протестировано на устройствах 4.1, 4.2 и 4.3.

Надеюсь, что это поможет.

Ответ 2

Официальная документация Выбор | Разработчики Android отмечают, что:

Выбор действий CAB

Вы можете решить, какие действия и элементы появятся в CAB. Использовать рекомендации в Шаблон панели действий, чтобы решить, какие элементы на поверхности на верхнем уровне и для перехода к переполнению действия.

Динамически настраивать действия CABВ большинстве случаев вам необходимо динамически корректировать действия в CAB пользователь добавляет больше элементов в выборку. Действия, которые применяются к отдельный выбранный элемент данных необязательно применяется к нескольким выбранным элементы данных того же типа.

К сожалению, ссылка, содержащаяся в цитатах, ссылается на раздел, который также содержит только общую информацию, не вникая в детали. Чтобы ухудшить ситуацию, он ссылается на Selection | Android Developers.

Посмотрев немного дальше, я нашел этот учебник от Ларса Фогеля. Я цитирую (форматирование):

Режим контекстного действия активирует временный ActionBar, который накладывает приложение ActionBar на время определенной подзадачи.

Режим контекстного действия обычно активируется путем выбора элемента или длительным нажатием на него.

Чтобы реализовать это, вызовите метод startActionMode() в представлении или в вашей деятельности. Этот метод получает объект ActionMode.Callback, который ответственный за жизненный цикл контекстного ActionBar.

Вы также можете назначить контекстное меню View через registerForContextMenu(view). Также активируется контекстное меню если пользователь "долго нажимает" на представление. Метод onCreateContextMenu()вызывается каждый раз, когда контекстное меню активируется как контекстное меню отбрасывается после его использования. Вы должны предпочесть контекстуальное действие режим использования контекстных меню.

В самой заметной ссылке упоминается, что мы можем создать собственное меню, используя registerForContextMenu(view). Вместо того, чтобы дублировать ответ, я нашел этот ответ J. Pablo Fernández, который содержит пример кода о том, как применить свою собственную CAB. Регистрация нового контекстного меню должна переопределять любое меню по умолчанию, но я не уверен. Поскольку я не могу проверить это на данный момент, я был бы рад узнать, решила ли эта проблема ваша проблема.