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

Я хочу переопределить существующую панель контекстных действий по умолчанию (CAB) для выбора текста. Я имею в виду, что я хочу отображать собственную CAB с моими собственными кнопками, когда в веб-просмотре выбран какой-то текст. Я попробовал реализовать 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; } }); 

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

Итак, если вы настроили прослушиватель LongClick, Webview перестанет показывать выбор вообще. После глубокого углубления в код Webview я обнаружил, что он вызывает метод startRunMode WebView и передает экземпляр класса 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.

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

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

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

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

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

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

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

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

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

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

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

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