Najprostszym sposobem na to jest przechowywanie wywołań JavaScript w wtyczce lub JavascriptInterface i powtarzanie metody po stronie javascript, która ją wykonuje. W ten sposób loadUrl
nigdy nie jest wywoływana.
Coś jak:
StringBuilder sb = null;
private final Object LOCK = new Object();
public void sendJavascript(String js){
synchronized(LOCK) {
if (sb == null){
sb = new StringBuilder();
sb.append("javascript:");
}
sb.append(js):
}
}
Następnie używając javascriptInterface:
private class JsInterface {
@JavascriptInterface
public String getJavascript(){
synchronized(LOCK) {
String javascriptToRun = sb.toString();
sb = new StringBuilder();
sb.append("javascript:");
return javascriptToRun;
}
}
}
Dodaj JavaScript interfejs do WebView:
JsInterface jsInterface = new JavascriptInterface();
webview.addJavascriptInterface(jsInterface, "JsInterface");
A w kodzie JavaScript ustawienie przedziału czasowego do pobierania zapisanej funkcji.
EDIT
Właśnie znalazłem this answer, pokazuje kopalnia ma duży problem, metody nie są zsynchronizowane. To znaczy, gdy wywołujesz getJavascript()
nasza zmienna sb
może nie być jeszcze gotowa do odczytania. Dodałem odpowiedni bit do źródła powyżej.
USE zamków lub Twój kod będzie niewiarygodne
Maby niechlujny rozwiązanie, można spróbować „życie” na klawiaturze, aby były widoczne (google it) lub sprawdzić stan klawiatury, i jeśli państwo jest "niewidoczny", możesz ustawić klawiaturę na widoczną. Nie wiem, czy to działa, po prostu pomysł. – Mdlc