Android WebView使用注意

这次参与的项目主要就是利用WebView进行开发,开发过程中发现WebView真是很难用,有很多意想不到的状况发生,许多功能都需要自己实现与控制,在此记录与总结一下遇到的问题。

1. webview加载的网页如果希望弹出对话框,需要webview对此进行支持,设置如下(如果需要定制对话框,可自行实现WebChromeClient进行定制):

webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebChromeClient(new WebChromeClient());
2. 如果希望换掉加载失败后的页面或显示加载中的画面,目前没有找到可以直接替换的方法,需要自己实现WebViewClient的方法来控制,首先webView.setWebViewClient(new WebViewClient());,其次,WebViewClient的具体代码实现如下:
public class WebViewClient extends android.webkit.WebViewClient {
        boolean isSuccess = true;
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            //显示加载中的画面
            customLoadView.showLoadingView();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            if (isSuccess) {
               //加载成功,隐藏加载中画面
               customLoadView.dismiss();
            }else{
               //加载失败后,显示加载失败的页面
               customLoadView.showErrorView();
            }
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            //加载界面元素失败
            if(failingUrl.equals(view.getUrl())) {
                isSuccess = false;
            }
        }

        @Override
        public void onLoadResource(WebView view, String url) {
            isSuccess = true;
        }
    }
这边对代码要稍作解释。

①isSuccess并不是在onPageStarted方法中设置为true,而是在onLoadResource中设置,主要原因如下:在部分机型(也有可能是部分Android版本)中,当网络不通的情况下加载失败后,会再走一次onPageStarted和onPageFinished方法(个人猜想是由于加载失败后会加载系统默认的错误页面,所以就会再走一次),此时如果在OnPageStarted方法里设置isSuccess为true,就会导致不会显示加载失败的页面。而对于onLoadResource方法,在失败之后并不会执行,所以在里面置isSuccess状态较为合适。

②在onReceivedError中,只有正在加载的主页加载失败即failingUrl.equals(view.getUrl())时,才将isSuccess置为false,而内部的资源加载失败的话,并不认为是失败。当然这是我个人的逻辑,这边也可以根据需要自行变更。

3. 如果希望对于网页中的超链接等跳转在本webview中显示,而不是跳到系统浏览器,需要重写shouldOverrideUrlLoading方法,具体参照上面的代码。

4. 如果需要与网页中的javascript函数互相交互,需要对webview注入交互对象,并指明交互对象的名称: webView.addJavascriptInterface(newJavaScriptApi(webView), JavaScriptApi.ClassName),具体的webview与javascript的交互将会在之后总结。

5. 如果希望网页中的输入框能有输入历史的下拉框提示,也是需要设置的,具体属性设置如下:webView.getSettings().setSaveFormData(true)

发布了42 篇原创文章 · 获赞 9 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jjxojm/article/details/41389899