Jaka jest różnica między setWebViewClient a setWebChromeClient?

243

Jaka jest różnica między setWebViewClientvs. setWebChromeClientw Androidzie?

Pentium10
źródło
Dodałem więcej informacji
Cristian

Odpowiedzi:

148

Z kodu źródłowego :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

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ć WebChromeClientobiektu 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ć:

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

A Twój WebView (teoretycznie) będzie miał zaimplementowane wszystkie funkcje (jako natywną przeglądarkę Androida).

Cristian
źródło
26
W tym formularzu odpowiedź nie jest kompletna. ChromeClient pozwala obsłużyć wyliczone rzeczy, ale czym jest ViewClient i jakie są podobieństwa i różnice?
Pentium
3
Czy ta metoda pomoże poprawić niektóre słabe funkcje domyślnego widoku internetowego? szczególnie dla animacji i przejść css3?
Ata Iravani,
1
Czy mogę korzystać z obu jednocześnie?
Sergey Dirin
1
@SergeyDirin: stackoverflow.com/a/6475858 . Zapoznaj się z tą odpowiedzią, możesz używać obu naraz.
hoangtu23
Jak obsługiwać uprawnienia do kamery w kliencie webviewclient, jeśli nie masz Chrome?
j2emanue
100

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ąc WebSettings.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)i onReceivedTitle(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ść na View.GONE.

Oświadczenie: Ta informacja pochodzi z Android Programming: The Big Nerd Ranch Guide za zgodą autorów. Aby uzyskać więcej informacji na temat tej książki lub kupić kopię, odwiedź stronę bignerdranch.com.

maytham-ɯɐɥʇʎɐɯ
źródło
11
Myślę, że to lepsza odpowiedź niż zaakceptowana.
redbeam_