2011-02-03 16 views
25

Mam problem z uzyskaniem wyboru z WebView w systemie Android.Android WebView JavaScript getSelection

Mogę przełączyć WebView w tryb wyboru. Potrafię nawet skopiować tekst do ClipBoard. Ale to, co naprawdę chcę zrobić, to trwale podkreślić wybór.

Pomysł polega na tym, aby ustawić WebView w trybie wyboru. Pozwól użytkownikowi wybrać tekst, a następnie uruchom coś, co podkreśli ten tekst. Mogę go uruchomić poprzez pobranie zaznaczonego tekstu ze schowka, a następnie wyszukanie go w JavaScript i podświetlenie go. Problem występuje, gdy użytkownik wybierze prawdziwe wspólne słowo. Muszę albo je wszystkie podświetlić, albo jakoś zorientować się, gdzie wybór jest właściwy.

Próbowałem tego JavaScript, który działa na iPhone. Funkcja Bu getSelection() nie działa na systemie 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); 
    } 
} 

Wszelkie sugestie?

+0

Jak masz to, aby skopiować tekst do schowka? Czy robisz to programowo, czy też możesz liczyć na to, że dokonasz wyboru ręcznie. –

Odpowiedz

0

Powinieneś spróbować rangy - Biblioteka JavaScript i biblioteka wyboru dla różnych przeglądarek.

+0

jak go używać w Androidzie – Ravi

+0

@Dainel w ten sam sposób, w jaki używasz go na dowolnej innej platformie - rangy to tylko zestaw plików JavaScript. – spektom

+0

w Android getSelection() nie zwraca niczego, więc czy możliwe jest rangy? – Ravi

9

Kiedy WebView przechodzi w "Tryb selekcji", WebView nie jest aktualnie używany do wyboru ... Jest pchany pod "WebTextView" (prywatna klasa w arsenale Androida), który naśladuje pozycję tekstu, ale pozwala obrazy do pokazania i pozwala "wybrać" tekst, który pojawia się w rzeczywistym kodzie HTML. Problem pojawia się, gdy próbujesz wejść w interakcję z WebView po "wybraniu" tekstu. Podświetlenia i uchwyty kursora znajdują się we właściwej pozycji, ale w rzeczywistości znajdują się w specjalnym WebTextView, o którym wspomniałem, w związku z tym nie masz wyboru, który można uzyskać za pomocą funkcji getSelection JavaScript lub jakichkolwiek innych metod w JavaScript. Pracuję nad utworzeniem ACTION_DOWN (z LongPress), które wyzwala wybór i przeciągnięcie oraz ACTION_UP wydania z przeciągania dla mnie za pomocą JavaScript, ale jest bardzo owłosione i wcale nie przyjazne dla użytkownika w tym momencie ...

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

sprawdzić źródło (to dużo pracy, aby naśladować zaznaczenie tekstu zamiast dostarczyć) to smutne, a obecnie bardzo bolesne dla projektu nasz zespół podjął - zwłaszcza po robi to samo Aplikacja na iPada ...

+0

Jakieś postępy w tej sprawie? Jak uzyskać instancję WebTextView do wyboru? – Brian

+0

Nie możesz. Jest to powłoka dostarczająca tekst, który żyje w WebView, ale nie ma dostępu do samego WebView ... http: // stackoverflow.com/questions/6948447/android-3-0-webview-text-selection-javascript Użyłem Java do przechwytywania ruchu podczas procesu selekcji i JavaScript, aby umożliwić wybór w samej WebView. – Dan

+0

Dan proszę przesłać mi kod Potrzebuję id i zmienna wybranego słowa w webview – Ravi

2

Wreszcie, w Androidzie 4.4 KitKat, WebView jest teraz oparty na Chromium.

Dlatego mamy dostęp do window.getSelection() !!

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

Testowane na Nexus 5 & Nexus 7.

+0

Jeśli używasz 'evaluateJavascript', dlaczego nie używać wartości zwracanej z' ValueCallback'? 'EvaluateJavascript ("(function() {return window.getSelection(). BaseNode.nodeValue})()", nowa ValueCallback () { @Override public void onReceiveValue (wartość String) { Log.v (TAG, "SELECTION:" + value); } }); } ' – Stan