Aktualizacja
KitKat dodaje metodę publiczną za wywoływanie JavaScript bezpośrednio: evaluateJavascript()
Dla starszych interfejsów API, można spróbować rozwiązania jak poniżej, ale gdybym miał to zrobić jeszcze raz będę wyglądać na samym budowaniu metody kompatybilności, która w KitKat używa powyższej metody i na starszych urządzeniach, używa refleksji, aby przejść do wewnętrznej, prywatnej metody: BrowserFrame.stringByEvaluatingJavaScriptFromString()
Następnie można nazwać javascript bezpośrednio, bez konieczności radzenia sobie z lo adUrl i dodanie do skryptu "javascript: "
.
Old Odpowiedź
Zgodnie z wnioskiem ALOK Kulkarni, dam szorstka przegląd ewentualnego obejścia myślałem od tego. Nie próbowałem tego, ale teoretycznie powinno działać. Ten kod będzie surowy i ma jedynie służyć jako przykład.
Zamiast wysyłać wywołania przez loadUrl(), kolejkujesz wywołania javascript, a następnie javascript usuwa je. Niektóre rzeczy takie jak:
private final Object LOCK = new Object();
private StringBuilder mPendingJS;
public void execJS(String js) {
synchronized(LOCK) {
if (mPendingJS == null) {
mPendingJS = new StringBuilder();
mPendingJS.append("javascript: ");
}
mPendingJS
.append(js)
.append("; ");
}
}
Zamiast wywoływać metodę loadUrl() wywołaj tę metodę. (Dla uproszczenia użyłem zsynchronizowanego bloku, ale może to być lepiej dostosowane do innej trasy, ponieważ javascript działa na własnym wątku, to będzie wymagało w ten czy inny sposób zabezpieczenia wątku).
Wtedy twój WebView musiałby interfejs tak:
public class JSInterface {
public String getPendingJS() {
synchronized(LOCK) {
String pendingCommands = mPendingJS.toString();
mPendingJS.setLength(0);
mPendingJS.append("javascript: ");
return pendingCommands;
}
}
}
która zwraca ciąg z toczącym poleceń i je tak, aby nie dostać zwracany znowu czyści.
by dodać go do WebView tak:
mWebView.addJavascriptInterface(new JSInterface(), "JSInterface");
Następnie w javascript by ustawić jakiś przedział, w którym należy opróżnić oczekujących poleceń. W każdym interwale wywołałby on JSInterface.getPendingJS()
, który zwróciłby ciąg wszystkich oczekujących poleceń, a następnie mógłbyś je wykonać.
Można to poprawić poprzez dodanie metody execJS, aby sprawdzić, czy pole EditText istnieje w WebView i jest aktywne. Jeśli takowy istnieje, to użyłbyś tej metody kolejkowania, ale jeśli nie było w niej fokusa, możesz po prostu wywołać metodę loadUrl() jak normalnie. W ten sposób wykorzystuje to obejście tylko wtedy, gdy faktycznie jest to konieczne.
spróbuj wywołać to po załadowaniuUrl(); ((InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE)). ToggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); – zeitue
Hmmmm, tak blisko. Klawiatura zamyka się, a następnie ponownie otwiera się bardzo szybko. Wygląda dość dziwnie;). Chociaż mogę eksperymentować z tym pomysłem więcej. – cottonBallPaws
Inną częścią problemu jest to, że clearTextEntry() usuwa także EditText, na którym koncentruje się klawiatura. – cottonBallPaws