Android WebView設置微技巧

Android WebView設置微技巧

前言

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

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

下面我就針對以上情況總結一下我在項目中對webview設置的一些技巧


具體設置

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

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

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監(jiān)聽牢屋,假如掃描二維碼進來或者點擊鏈接為下載鏈接直接啟動系統(tǒng)瀏覽器下載且预。

拿到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();
            }
        });

監(jiān)聽返回事件,假如mWebview有上一個網頁烙无,mWebview.goBack();去上一個網頁锋谐,否則直接返回

點擊網頁里的鏈接不要啟動系統(tǒng)瀏覽器

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

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的時候監(jiā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);
        }
    }
});

最后在設置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的坑,歡迎留言提醒

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末念搬,一起剝皮案震驚了整個濱河市抑堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锁蠕,老刑警劉巖夷野,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荣倾,居然都是意外死亡悯搔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門舌仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒貌,“玉大人,你說我怎么就攤上這事铸豁」嗍铮” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵节芥,是天一觀的道長在刺。 經常有香客問我逆害,道長,這世上最難降的妖魔是什么蚣驼? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任魄幕,我火速辦了婚禮,結果婚禮上颖杏,老公的妹妹穿的比我還像新娘纯陨。我一直安慰自己,他們只是感情好留储,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布翼抠。 她就那樣靜靜地躺著,像睡著了一般获讳。 火紅的嫁衣襯著肌膚如雪阴颖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天赔嚎,我揣著相機與錄音膘盖,去河邊找鬼。 笑死尤误,一個胖子當著我的面吹牛侠畔,可吹牛的內容都是我干的。 我是一名探鬼主播损晤,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼软棺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尤勋?” 一聲冷哼從身側響起喘落,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎最冰,沒想到半個月后瘦棋,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡暖哨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年赌朋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篇裁。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛慢,死狀恐怖,靈堂內的尸體忽然破棺而出达布,到底是詐尸還是另有隱情团甲,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布黍聂,位于F島的核電站躺苦,受9級特大地震影響身腻,放射性物質發(fā)生泄漏。R本人自食惡果不足惜圾另,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一霸株、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧集乔,春花似錦、人聲如沸坡椒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔叼。三九已至汗唱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丈攒,已是汗流浹背哩罪。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡验,地道東北人际插。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像显设,于是被迫代替她去往敵國和親框弛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • 關于 android Webview 基本使用 加載html四種方式 簡單使用 在AndroidManifest....
    小面包屑閱讀 5,379評論 2 13
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫捕捂、插件瑟枫、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 忽然間發(fā)現(xiàn),我好幸福指攒,土豪家有萬盞天燈慷妙,但我卻在凝眸星空,無邊漫野允悦,點亮我的心門膝擂。 長途浩浩,我沒有萬千崇拜澡屡,但我...
    美麗的井溝村折川社神話閱讀 209評論 2 6
  • 新模式:什么是S2B 2012年猿挚,我和馬云聊天的時候,我們碰撞出了C2B的提法驶鹉,也就是Customer to Bu...
    枕書入夢閱讀 657評論 0 0