Jaka jest różnica między setWebViewClient
vs. setWebChromeClient
w Androidzie?
android
webviewclient
webchromeclient
Pentium10
źródło
źródło
Odpowiedzi:
Z kodu źródłowego :
Korzystanie z WebChromeClient umożliwia obsługę okien dialogowych JavaScript, ulubionych, tytułów i postępu. Spójrz na ten przykład: Dodanie obsługi alert () do WebView
Na pierwszy rzut oka istnieje zbyt wiele różnic między WebViewClient i WebChromeClient . Ale w zasadzie: jeśli tworzysz WebView, który nie będzie wymagał zbyt wielu funkcji, ale renderuje HTML, możesz po prostu użyć
WebViewClient
. Z drugiej strony, jeśli chcesz (na przykład) załadować favicon renderowanej strony, powinieneś użyćWebChromeClient
obiektu i przesłonićonReceivedIcon(WebView view, Bitmap icon)
.W większości przypadków, jeśli nie chcesz się tym martwić ... możesz po prostu to zrobić:
A Twój WebView (teoretycznie) będzie miał zaimplementowane wszystkie funkcje (jako natywną przeglądarkę Androida).
źródło
Wydaje mi się, że to pytanie wymaga nieco więcej szczegółów. Moja odpowiedź jest zainspirowana programowaniem na Androida, The Nerd Ranch Guide (2nd edition).
Domyślnie JavaScript jest wyłączony w WebView. Nie zawsze trzeba go mieć, ale w przypadku niektórych aplikacji może to wymagać.
Ładowanie adresu URL należy wykonać po skonfigurowaniu WebView, więc musisz to zrobić na koniec. Wcześniej
getSettings()
włączasz JavaScript, wywołując instancję WebSettings i wywołującWebSettings.setJavaScriptEnabled(true)
. WebSettings to pierwszy z trzech sposobów modyfikacji WebView. Ma różne właściwości, które można ustawić, takie jak ciąg agenta użytkownika i rozmiar tekstu.Następnie skonfigurujesz swojego WebViewClient. WebViewClient to interfejs zdarzeń. Udostępniając własną implementację WebViewClient, możesz reagować na zdarzenia renderowania. Na przykład można wykryć, kiedy moduł renderujący rozpoczyna ładowanie obrazu z określonego adresu URL lub zdecydować, czy ponownie przesłać żądanie POST do serwera.
WebViewClient ma wiele metod, które można zastąpić, z którymi większość nie będzie sobie radzić. Musisz jednak zastąpić domyślną implementację WebViewClient
shouldOverrideUrlLoading(WebView, String)
. Ta metoda określa, co się stanie, gdy nowy adres URL zostanie załadowany do WebView, na przykład poprzez naciśnięcie łącza. Jeśli zwrócisz wartość true, mówisz: „Nie obsługuj tego adresu URL, sam go obsługuję”. Jeśli zwrócisz false, mówisz: „Ściągnij ten adres URL, WebView, nic z tym nie robię”.Domyślna implementacja wyzwala niejawne zamiary za pomocą adresu URL, tak jak wcześniej. Jednak teraz byłby to poważny problem. Pierwszą rzeczą, jaką robią niektóre aplikacje internetowe, jest przekierowanie do mobilnej wersji witryny. W przypadku domyślnego WebViewClient oznacza to, że natychmiast zostajesz wysłany do domyślnej przeglądarki internetowej użytkownika. Właśnie tego próbujesz uniknąć. Poprawka jest prosta - po prostu zastąp domyślną implementację i zwróć false.
Użyj WebChromeClient, aby ulepszyć zawartość Ponieważ poświęcasz czas na stworzenie własnego WebView, powiększmy go trochę, dodając pasek postępu i aktualizując podtytuł paska narzędzi tytułem załadowanej strony.
Zahaczyć się ProgressBar, można użyć drugiego zwrotnej WebView:
WebChromeClient
.WebViewClient to interfejs do reagowania na renderowanie zdarzeń; WebChromeClient to interfejs zdarzeń służący do reagowania na zdarzenia, które powinny zmieniać elementy chrome w przeglądarce. Obejmuje to powiadomienia JavaScript, ulubione i oczywiście aktualizacje dotyczące postępu ładowania i tytułu bieżącej strony.
Podłącz to
onCreateView(…)
. Używanie WebChromeClient do podkręcania elementów Aktualizacje postępu i aktualizacje tytułu mają swoją własną metodę wywołania zwrotnego,onProgressChanged(WebView, int)
ionReceivedTitle(WebView, String)
. Postęp, który otrzymujesz,onProgressChanged(WebView, int)
jest liczbą całkowitą od 0 do 100. Jeśli jest to 100, wiesz, że ładowanie strony zostało zakończone, więc ukrywasz pasek postępu, ustawiając jego widoczność naView.GONE
.źródło