2011-02-03 2 views
25

У меня возникли проблемы с выбором из WebView в Android.Android WebView Javascript getSelection

Я могу заставить WebView перейти в режим выбора. Я даже могу заставить его скопировать текст в ClipBoard. Но я действительно хочу подчеркнуть выбор навсегда.

Итак, идея заключается в том, что WebView находится в режиме выбора. Пусть пользователь выбирает текст, а затем запускает что-то, чтобы выделить этот текст. Я могу заставить его работать, получив выделенный текст из буфера обмена, а затем ищите его в Javascript и выделите его. Проблема возникает, когда пользователь выбирает реальное общее слово. Я должен либо выделить их всех, либо как-то выяснить, где выбор, чтобы получить правильный.

Я пробовал этот JavaScript, который работает на iPhone. Bu getSelection(), похоже, не работает на Android.

function highlight(colour) { 
    var range, sel; 
    if (window.getSelection) { 
      // Non-IE case 
     sel = window.getSelection(); 
     if (sel.getRangeAt) { 
      range = sel.getRangeAt(0); 
     } 
     document.designMode = "on"; 
     if (range) { 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } 
      // Use HiliteColor since some browsers apply BackColor to the whole block 
     if (!document.execCommand("HiliteColor", false, colour)) { 
      document.execCommand("BackColor", false, colour); 
     } 
     document.designMode = "off"; 
    } else if (document.selection && document.selection.createRange) { 
      // IE case 
     range = document.selection.createRange(); 
     range.execCommand("BackColor", false, colour); 
    } 
} 

Любые предложения?

+0

Как вы получите его, чтобы скопировать текст в буфер обмена? Вы делаете это программно или рассчитываете на то, что пользователь сделает выбор вручную. –

ответ

0

Вы должны попробовать rangy - Кросс-браузерный JavaScript-диапазон и библиотека выбора.

+0

как использовать его в android – Ravi

+0

@ Dainel так же, как вы используете его на любой другой платформе - rangy - это всего лишь набор файлов JavaScript. – spektom

+0

в android getSelection() ничего не возвращает, так что это возможно быть rangy ?? – Ravi

9

Когда WebView переходит в «Режим выбора», WebView фактически не используется для выбора ... Он подталкивается под «WebTextView» (частный класс в арсенале Android), который имитирует текстовую позицию, но позволяет изображения, которые можно просмотреть, и позволяет вам «выбрать» текст, который отображается в фактическом HTML. Проблема возникает, когда вы пытаетесь взаимодействовать с WebView после «выбора» текста. Ручки выделения и курсора находятся в правильном положении, но они фактически находятся в специальном WebTextView, о котором я упомянул, поэтому на самом деле у вас нет выбора для получения через getSelection JavaScript или любых других средств в JavaScript. Я работаю над созданием ACTION_DOWN (из LongPress), который запускает выбор, а drag и ACTION_UP релиза от перетаскивания работают для меня с помощью JavaScript, но он очень волосатый и совсем не удобный для пользователя на этом этапе ...

http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/webkit/WebTextView.java.htm

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

+0

Прогресс на этом? Как вы получаете экземпляр WebTextView для выбора? – Brian

+0

Вы не можете. Это оболочка для предоставления текста, который живет в WebView, но не доступа к самому WebView ... http: // stackoverflow.com/questions/6948447/android-3-0-webview-text-selection-javascript Я использовал Java для захвата движения во время процесса выбора и JavaScript для включения выделения внутри самого WebView. – Dan

+0

Dan, пожалуйста, присылайте мне код. Мне нужен идентификатор и тэг выбранного слова в webview. – Ravi

2

Наконец, в Android 4.4 KitKat WebView теперь основан на Chromium.

Следовательно, у нас есть доступ к window.getSelection() !!

wv.evaluateJavascript("console.log(window.getSelection().baseNode.nodeValue);", null); 

Проверено на Nexus 5 & Nexus 7.

+0

Если вы используете 'оценочный javascript', почему бы не использовать возвращаемое значение из' ValueCallback'? 'EvaluateJavascript ("(функция() {вернуться window.getSelection(). BaseNode.nodeValue})()", новый ValueCallback () { @Override общественного недействительными onReceiveValue (значение String) { Log.v (TAG, "SELECTION:" + значение); } }); } ' – Stan