2010-12-27 7 views
7

Używam WebView do mojej aplikacji Androind. Mam problem i poproszę o pomoc.Klawiatura w wejściowym tekście HTML znika, gdy wywołanie WebView "loadUrl" ponownie

Na stronie HTML znajduje się pole tekstowe. Kiedy robi się „FOCUS”, a potem zadzwonić

  mWebView.setFocusableInTouchMode(true); 

w kodzie Javy tak, że Android soft-klawiatura pop-up, aby dać mi klucz.

Problem polega na tym, że trzeba za pomocą wielowątkowego dla niektórych procesów w języku Java i zadzwoń pod numer

  mWebView.loadUrl(strJSCall); 

jako oddzwanianie, aby wykonać funkcję JavaScript, ale klawiatura zostanie ukryta!

Sposób, w jaki próbuję, to wymuszenie ponownego wyświetlenia klawiatury. Ale w jaki sposób klawiatura zawsze pokazuje się po wywołaniu "loadUrl"? Czy ktoś może spotkać się z tym samym problemem i rozwiązać go już?

poważaniem Jr.

+0

Mam podobny problem w systemie Android 3.0 (Motorola Zoom). Na innych urządzeniach z Androidem 2.x działa normalnie. Znalazłeś rozwiązanie? –

Odpowiedz

2

mam ten sam problem i nie w pełni rozwiązany jeszcze.

byłem w stanie zmusić klawiaturę, aby pokazać po wywołaniu webView.loadUrl, najpierw trzeba dowiedzieć się, czy klawiatura jest wyświetlana, użyłem zmodyfikowaną wersję tego How to check visibility of software keyboard in Android?

następnie wywołać

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT); 

Ale jeśli lubisz mnie, musisz komunikować się z JavaScript w WebView po każdym naciśnięciu klawisza, to podejście powoduje migotanie klawiatury podczas próby animowania w górę iw dół.
Pomija także niektóre dane wejściowe w zależności od tego, jak szybko piszesz.

5

Problem z loadUrl polega na tym, że przerywa wątek interfejsu i nadal zamyka metodę wprowadzania danych. Jedynym solidnym sposobem, aby to zrobić, jest sprawdzenie, jaki kursor znajduje się na widoku internetowym i nadpisanie domyślnego zachowania loadUrl w twojej przeglądarce internetowej.

Wewnątrz niestandardowego WebView:

@Override 
public void loadUrl(String url) { 
    HitTestResult testResult = this.getHitTestResult(); 
    if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE) 
    { 
      //Don't do anything right now, we have an active cursor on the EDIT TEXT 
      //This should be Input Method Independent 
    } 
    else 
    { 
     super.loadUrl(url); 
    } 
} 

Zapobiegnie to natywny bok ładowanie Javascript wypalania kiedy trzeba skupić się na polu tekstowym w WebKit. Nie jest doskonały, ale unika bałaganu, próbując dowiedzieć się, czy twoje pole tekstowe jest widoczne przez zmianę rozmiaru WebView. Wykonywanie Javascript w widoku webowym powinno nadal działać poprawnie.

Jeszcze raz, jeśli potrzebujesz czegoś do aktualizacji podczas pisania, być może będziesz musiał znaleźć inny sposób komunikacji Java z Javascriptem, który nie blokuje wątku UI. Jest to trudny problem, który wciąż nie został jeszcze rozwiązany.

+0

Dzięki za odpowiedź. Zastąpiłem ten interfejs API, ale używając metody "odbicia", aby uniknąć wywołania funkcji ukrywania wirtualnej klawiatury. –

+0

@Jr. czy możesz wyjaśnić, co dokładnie zrobiłeś, aby to naprawić? Dzięki. – Piotr

1

W systemie Android wykonywanie javascript z WebView jest jednokierunkowe: wywoływanie WebView.loadUrl ("javascript: sub (1,1)"); Nie można uzyskać wartości zwrotu bezpośrednio.

Istnieje sposób asynchroniczny JavaScript, aby uzyskać wartości zwracanej przez funkcję: How to get return value from javascript in webview of android?

Ale w większości przypadków, musimy metodę synchronizacji zamiast drogę transmisji asynchronicznej.Na przykład, gdy wydarzenie kliknięcia jest przekazywane do metody onTouch systemu Android WebView, chcemy wykonać skrypt JavaScript, aby odczytać kliknięte informacje o elemencie.

Próbowałem dwa rozwiązania: 1. Użyj Java zmiennej P/V zawinąć metodę synchronizacji z async na roztwór wygląda następująco: How to get return value from javascript in webview of android?

Rozwiązanie jest całkowicie nie działa, ponieważ metody wait zablokuje wykonanie JavaScript i JavaScriptInterface. Więc jeśli chcemy uzyskać wynik metody js w wątku interfejsu użytkownika. to nie jest możliwe.

  1. Skorzystaj z Java Reflection, aby uzyskać macierzysty interfejs stringByEvaluatingJavaScriptFromString. Exist stringByEvaluatingJavaScriptFromString for Android

działa bardzo dobrze, jedyne co potrzeba do opieki jest metodą wstępnej refleksji gdy strona ładowane wykończone. Próbowałem zainicjować odbicie wewnątrz konstruktora WebView, ale nie udało się. Myślę, że konstruktor jest metodą asynchroniczną.

Powiązane problemy