Android WebView设置微技巧

2016-12-16  本文已影响194人  sgffsg

Android WebView设置微技巧

前言

Android开发中WebView肯定是我们经常用到的类之一,但是Webview里面也有很多小细节,很多坑需要注意。相信大家都遇到过这样的场景:

下面我就针对以上情况总结一下我在项目中对webview设置的一些技巧


具体设置

判断下载链接直接启动系统浏览器下载

webview可以设置DownloadListener以监听是否是下载请求,这时可以做出判断

mWebview.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                Uri content_url = Uri.parse(url);
                intent.setData(content_url);
                startActivity(intent);
            }
        });

上面的设置就是让webview监听,假如扫描二维码进来或者点击链接为下载链接直接启动系统浏览器下载。

拿到title然后显示

//设置WebChromeClient设置标题title
        mWebview.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                Logger.d("title:" + title);
                if (TextUtils.isEmpty(mTitle)) {
                    tv_title.setText(title);
                } else {
                    tv_title.setText(mTitle);
                }
            }
        });

这段代码就是使用WebChromeClient获取title,拿到之后可以直接设置Activity的标题

点击back去下一个网页

//启用支持javascript
WebSettings settings = mWebview.getSettings();
settings.setJavaScriptEnabled(true);
//自适应屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
tvTitleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mWebview.canGoBack()){
                    mWebview.goBack();
                }else
                    finish();
            }
        });

监听返回事件,假如mWebview有上一个网页,mWebview.goBack();去上一个网页,否则直接返回

点击网页里的链接不要启动系统浏览器

还有一个问题,假如你设置了mWebview.setWebChromeClient,很多手机估计直接就启动系统浏览器了,假如不想启动系统浏览器在下面加上这几句代码

mWebview.setWebViewClient(new WebViewClient() {

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
                  }

        });

加入进度条

首先在XML文件中加进度条

<ProgressBar
    android:id="@+id/webview_progressbar"
    android:layout_width="match_parent"
    android:layout_height="3dp"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"
    android:background="@color/white"
    android:progressBackgroundTint="@color/white"
    android:indeterminateTint="@color/webview_progressbar_color"
    android:indeterminateTintMode="src_atop"/>

然后在webview设置WebChromeClient的时候监听加载进度,并显示到进度条

mWebview.setWebChromeClient(new WebChromeClient() {

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
        progressBar.setProgress(newProgress);
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        KLog.d("title:" + title);
        if (TextUtils.isEmpty(mTitle)) {
            tvTitle.setText(title);
        } else {
            tvTitle.setText(mTitle);
        }
    }
});

最后在设置WebViewClient的时候可以判断开始与结束,然后设置进度条的隐藏与显示,

mWebview.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        progressBar.setVisibility(View.GONE);
    }
});

视频播放

正常情况播放视频是没有问题的,但是有些有的视频无法在这个webview下播放。这时候需要设置一下
在AndroidManifest.xml文件中对这个Activity加入:

android:hardwareAccelerated="true"

webview设置

if (Build.VERSION.SDK_INT < 8) {

webview.getSettings().setPluginsEnabled(true);
} else {

webview.getSettings().setPluginState(PluginState.ON);
}

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) { 
webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

One more thing

还有一个小事情就是有时候由于对某些标签的不支持,导致webview加载不出来某些网页,比如这个网页https://gold.xitu.io/post/584d52fdb123db00661c59fa这时候加上一句代码就可以了

settings.setDomStorageEnabled(true);

这个小事情是参考这里:http://blog.csdn.net/zhoudailiang/article/details/50109621

最后

其他朋友肯定也遇到过关于webview的坑,欢迎留言提醒

上一篇 下一篇

猜你喜欢

热点阅读