WebViewClient和WebChromeClient是互斥的吗?
从这个关于WebViewClient
和WebChromeClient
之间差异的很好的解释看来,如果你使用一个,你不应该使用其他的(对于同一个WebView对象)。
我的理解是正确的吗?
如果不是,那么在什么时候将WebViewClient
和 WebChromeClient
用于同一个WebView
对象?
有没有一个情况的例子,只有同一个WebView
对象使用WebViewClient
和 WebChromeClient
才能完成特定的目标?
你当然可以同时使用,他们只是有不同的function。 设置你自己定制的WebViewClient可以让你处理onPageFinished,shouldOverrideUrlLoading等,WebChromeClient让你处理Javascript的alert()和其他function。
只要自己创build一个类,例如:
public class MyWebChromeClient extends WebChromeClient { //Handle javascript alerts: @Override public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) { Log.d("alert", message); Toast.makeText(context, message, 3000).show(); result.confirm(); return true; }; ...
和/或
public class MyWebViewClient extends WebViewClient { @Override //Run script on every page, similar to Greasemonkey: public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:alert('hi')"); } ...
只需覆盖文档中描述的function,然后在onCreate中设置您的客户端:
webview.setWebViewClient(new MyWebViewClient()); webview.setWebChromeClient(new MyWebChromeClient());
您可以同时使用两个客户端。 这是有用的,因为它们都提供不同的function。
例如,如果您想要:
- 按照Web视图中的redirect,而不是打开可用的浏览器
和
- 跟踪加载进度
这是不可能的只有一个客户端,你可以做到以下几点:
WebView webView = (WebView) findViewById(R.id.web_view); webView.setWebViewClient(new WebViewClient()); webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); // Your custom code. } });
由于shouldOverrideUrlLoading(WebView,String)方法的默认实现可以用于上述情况,因此除非您想要其他行为,否则无需重写它。
- 开关case语句错误:caseexpression式必须是常量expression式
- 执行任务':app:dexDebug'失败。 com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException
- 在Android Studio和Gradle中使用ViewPagerIndicator库
- 活动/片段暂停时如何处理Handler消息
- Android:如何使每个国家的可点击的地图图像产生不同的动作?
- getColor(int id)在Android 6.0 Marshmallow(API 23)上弃用
- 设置标题背景颜色
- android:onClick XML属性与setOnClickListener有什么不同?
- 是否有可能在Android库项目中获取应用程序的上下文?