Android WebView設(shè)置微技巧

Android WebView設(shè)置微技巧

前言

Android開發(fā)中WebView肯定是我們經(jīng)常用到的類之一,但是Webview里面也有很多小細(xì)節(jié),很多坑需要注意。相信大家都遇到過這樣的場(chǎng)景:

  • 掃描二維碼跳轉(zhuǎn)WebView時(shí)我們希望如果是一個(gè)下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載
  • Activity的title我們希望在網(wǎng)頁(yè)里面拿到title然后顯示
  • 文本圖片等能夠自動(dòng)適配屏幕,不要圖片只顯示一半
  • 點(diǎn)擊back不是回上一個(gè)activity而是去下一個(gè)網(wǎng)頁(yè)
  • 點(diǎn)擊網(wǎng)頁(yè)里的鏈接不要啟動(dòng)系統(tǒng)瀏覽器
  • 頂部顯示加載進(jìn)度條,類似微信
  • Webview無(wú)法播放視頻
  • WebView加載不出網(wǎng)頁(yè),微信卻可以

下面我就針對(duì)以上情況總結(jié)一下我在項(xiàng)目中對(duì)webview設(shè)置的一些技巧


具體設(shè)置

判斷下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載

webview可以設(shè)置DownloadListener以監(jiān)聽是否是下載請(qǐng)求,這時(shí)可以做出判斷

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);
            }
        });

上面的設(shè)置就是讓webview監(jiān)聽,假如掃描二維碼進(jìn)來(lái)或者點(diǎn)擊鏈接為下載鏈接直接啟動(dòng)系統(tǒng)瀏覽器下載。

拿到title然后顯示

//設(shè)置WebChromeClient設(shè)置標(biāo)題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,拿到之后可以直接設(shè)置Activity的標(biāo)題

點(diǎn)擊back去下一個(gè)網(wǎng)頁(yè)

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

監(jiān)聽返回事件,假如mWebview有上一個(gè)網(wǎng)頁(yè),mWebview.goBack();去上一個(gè)網(wǎng)頁(yè),否則直接返回

點(diǎn)擊網(wǎng)頁(yè)里的鏈接不要啟動(dòng)系統(tǒng)瀏覽器

還有一個(gè)問題,假如你設(shè)置了mWebview.setWebChromeClient,很多手機(jī)估計(jì)直接就啟動(dòng)系統(tǒng)瀏覽器了,假如不想啟動(dòng)系統(tǒng)瀏覽器在下面加上這幾句代碼

mWebview.setWebViewClient(new WebViewClient() {

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

        });

加入進(jìn)度條

首先在XML文件中加進(jìn)度條

<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設(shè)置WebChromeClient的時(shí)候監(jiān)聽加載進(jìn)度,并顯示到進(jìn)度條

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);
        }
    }
});

最后在設(shè)置WebViewClient的時(shí)候可以判斷開始與結(jié)束,然后設(shè)置進(jìn)度條的隱藏與顯示,

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);
    }
});

視頻播放

正常情況播放視頻是沒有問題的,但是有些有的視頻無(wú)法在這個(gè)webview下播放。這時(shí)候需要設(shè)置一下
在AndroidManifest.xml文件中對(duì)這個(gè)Activity加入:

android:hardwareAccelerated="true"

webview設(shè)置

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

還有一個(gè)小事情就是有時(shí)候由于對(duì)某些標(biāo)簽的不支持,導(dǎo)致webview加載不出來(lái)某些網(wǎng)頁(yè),比如這個(gè)網(wǎng)頁(yè)https://gold.xitu.io/post/584d52fdb123db00661c59fa這時(shí)候加上一句代碼就可以了

settings.setDomStorageEnabled(true);

這個(gè)小事情是參考這里:http://blog.csdn.net/zhoudailiang/article/details/50109621

最后

其他朋友肯定也遇到過關(guān)于webview的坑,歡迎留言提醒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,018評(píng)論 25 708
  • 關(guān)于 android Webview 基本使用 加載html四種方式 簡(jiǎn)單使用 在AndroidManifest....
    小面包屑閱讀 5,448評(píng)論 2 13
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,198評(píng)論 4 61
  • 忽然間發(fā)現(xiàn),我好幸福,土豪家有萬(wàn)盞天燈,但我卻在凝眸星空,無(wú)邊漫野,點(diǎn)亮我的心門。 長(zhǎng)途浩浩,我沒有萬(wàn)千崇拜,但我...
    美麗的井溝村折川社神話閱讀 217評(píng)論 2 6
  • 新模式:什么是S2B 2012年,我和馬云聊天的時(shí)候,我們碰撞出了C2B的提法,也就是Customer to Bu...
    枕書入夢(mèng)閱讀 670評(píng)論 0 0