Android 3.x ТОЛЬКО Выбор текста WebView + JavaScript - PullRequest
11 голосов
/ 05 августа 2011

Проблемная область: считыватель формата ePub на базе Android WebView -

Нам нужны текстовые выделения, которые доступны через методы JavaScript (т. Е. Включить их, выключить, сохранить их, отправить их по электронной почте и т. Д.)

Кто-нибудь в курсе, пожалуйста, поправьте меня, если я ошибаюсь: При выделении текста в WebView -

По сути, нам передается наложение TextView (WebTextView), которое НИКОГДА НЕ ПРИКЛАДЫВАЕТСЯ к базовому html, кроме как визуально (хорошая работа по выравниванию всего этого и созданию бесшовного, кстати), для которого мы выполняем TextSelectionActionMode и ClipboardManager поставляется с результатами ... чтобы прояснить это, фактический HTML-код с WebView на самом деле НЕ выбирается ни разу во время этого процесса обработки, поэтому JavaScript не может получить доступ к результатам действия.

Итак, чтобы заставить это поведение работать в 3.1+, у меня есть несколько возможных планов на будущее для реализации моего собственного выбора в WebView - это та часть, где мне интересно, если я не могу видеть из своего угла :) -

1) захватить MOTION_DOWN длинного щелчка, который запускает режим выбора, переопределить встроенный TextSelection ActionMode (чтобы обеспечить брендинг клиентов - способ, который я обнаружил, так хакерски причиняет боль) наблюдает за перетаскиванием, захватывает позицию MOTION_UP , сопоставьте эти координаты на WebView и сделать мой выбор на основе координат (сравнивая текст с текстом, захваченным ClipboardManager)

2) создайте свой собственный "WebTextView" (вся работа в лотерею, смеется) и не так хакерски создайте свой собственный ActionMode и выполните все вышеперечисленное.

3) использовать MotionEvents, сгенерированные процессом выбора акций, и каким-то образом переопределить режим Action TextSelection, вызванный этим.

Это варианты, которые я вижу, надеюсь, моя близость и разочарование с этим меня ослепили проще (читай как встроенный) Решение или два.

Еще раз спасибо за ваше время.

Ответы [ 2 ]

11 голосов
/ 06 июля 2012

Я получил это работает в 2.2 - 4.0.3.Я использовал интерфейс javascript и передал ему все штрихи.Решение, кажется, работает очень хорошо, и я поместил пример проекта на github.Проект github включает необходимые файлы js в папке активов, а также тестовую страницу и веб-представление, которое загружает тестовую страницу и реализует все необходимые методы для обработки выбора.Ссылка на проект github: https://github.com/btate/BTAndroidWebViewSelection. Имею на это.

1 голос
/ 09 апреля 2012

Я не уверен на 100%, какие методы / свойства дают вам Range и Selection.Я не видел ни одного в документации.Но я смог получить выделенный диапазон в пикселях, используя отражение.Не уверен, что это кому-нибудь поможет, но думал, что это стоит опубликовать здесь.

Region result = null;
try {
     Object[] params = null;

     Method nativeGetSelectionRegion = WebView.class.getDeclaredMethod("nativeGetSelectionRegion");
     nativeGetSelectionRegion.setAccessible(true);     
     result = (Region)nativeGetSelectionRegion.invoke(this, params);


     Log.i(TAG, "res: region " + result.getBounds().toShortString());

 } catch (Exception e) {
     e.printStackTrace();
 }

Надеюсь, это кому-нибудь поможет

...