2012-10-24 21 views
7

W WebView po uruchomieniu JavaScript przez webview.loadUrl(), softkeyboard znika, jeśli jest widoczny. Kiedy próbuję wpisać jakiś tekst w polu tekstowym HTML, Softkeyboard znika (jeśli JavaScript jest wykonywany) i nie mogę wpisać całego tekstu.Na webview w przeglądarce Android po uruchomieniu javascript sotfkeyboard znika

Pole tekstowe nie traci ostrości, więc znak zachęty nadal znajduje się w polu tekstowym, ale klawiatura klawiszy programowych nie działa.

Czy ktoś może mi powiedzieć, jak to naprawić?

+0

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

Odpowiedz

1

Jest to oczekiwane zachowanie: dzwoniąc pod numer WebView.loadUrl(), w zasadzie przeładowuje się stronę, dlatego miękka klawiatura jest odrzucana.

Można również spróbować określić, czy wyświetlana jest klawiatura ekranowa i opóźniać wykonanie JS, dopóki nie zostanie ukryta. Aby uzyskać ogólną metodę sprawdzania stanu klawiatury programowej, zobacz: How to check visibility of software keyboard in Android?

5

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

Powiązane problemy