2011-02-03 32 views
25

Ho difficoltà a ottenere la selezione da una WebView in Android.Android WebView Javascript getSelection

Posso ottenere la WebView per andare in modalità di selezione. Posso persino farlo copiare il testo nella ClipBoard. Ma quello che voglio davvero è evidenziare la selezione in modo permanente.

Quindi l'idea è mettere il WebView in modalità di selezione. Consenti all'utente di selezionare il testo e quindi di attivare qualcosa per evidenziare quel testo. Posso farlo funzionare recuperando il testo selezionato dagli Appunti, quindi cercarlo in Javascript ed evidenziarlo. Il problema si verifica quando l'utente seleziona una vera parola comune. Devo o evidenziarli tutti o in qualche modo capire dove la selezione è quella giusta.

Ho provato questo JavaScript che funziona su iPhone. Bu getSelection() non sembra funzionare su 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); 
    } 
} 

Qualche suggerimento?

+0

Come si arriva a copiare il testo negli appunti? Lo fai a livello di programmazione o contando sull'utente per effettuare la selezione manualmente. –

risposta

0

Si dovrebbe provare rangy - Un intervallo JavaScript cross-browser e libreria di selezione.

+0

come usarlo in Android – Ravi

+0

@Dainel nello stesso modo in cui lo si utilizza su qualsiasi altra piattaforma - rangy è solo un insieme di file JavaScript. – spektom

+0

in Android getSelection() non restituisce nulla, quindi è possibile essere rangy ?? – Ravi

9

Quando la WebView entra in "Modalità di selezione", la WebView non viene effettivamente utilizzata per la selezione ... Viene spinta sotto "WebTextView" (classe privata nell'arsenale di Android) che imita la posizione del testo, ma consente immagini da mostrare e consente di "selezionare" il testo che appare nel codice HTML effettivo. Il problema si presenta quando si tenta di interagire con WebView dopo aver "selezionato" il testo. L'evidenziazione e le maniglie del cursore sono nella posizione corretta, ma sono effettivamente nello speciale WebTextView che ho menzionato, quindi in realtà non si dispone di una selezione da ottenere tramite getSelection di JavaScript o altri mezzi in JavaScript. Sto lavorando per rendere ACTION_DOWN (del LongPress) che attiva la selezione e il drag and ACTION_UP della release di drag funziona per me tramite JavaScript, ma è molto peloso, e per niente facile da usare a questo punto ...

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

controllo della fonte (che è un sacco di lavoro per imitare la selezione del testo, invece di fornire) e 'triste, e attualmente molto doloroso per un progetto la nostra squadra si è impegnata - soprattutto dopo aver fatto lo stesso app per iPad ...

+0

Qualche progresso su questo? Come si ottiene un'istanza di WebTextView per la selezione? – Brian

+0

Non puoi. È una shell che fornisce il testo che vive in WebView, ma non accede a WebView stesso ... http: // stackoverflow.it/questions/6948447/android-3-0-webview-text-selection-javascript Ho usato Java per catturare il movimento durante un processo di selezione e JavaScript per abilitare la selezione all'interno di WebView. – Dan

+0

Dan per favore inviatemi del codice ho bisogno dell'ID e tagname della parola selezionata in webview – Ravi

2

Infine, in Android 4.4 KitKat, WebView è ora basato su Chromium.

Pertanto, abbiamo accesso a window.getSelection() !!

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

provata su Nexus 5 & Nexus 7.

+0

Se si utilizza 'evaluateJavascript' perché non utilizzare il valore restituito da' ValueCallback'? 'EvaluateJavascript ("(function() {return window.getSelection(). BaseNode.nodeValue})()", nuova ValueCallback () { @Override pubblico onReceiveValue void (String value) { Log.v (TAG, "SELEZIONE:" + valore); } }); } ' – Stan

Problemi correlati