Android webview 加載html片段筆記

場景:一些內(nèi)容是直接PC端編輯器保存的柔袁,包含了大量的html標(biāo)簽甚至是ubb語言的標(biāo)簽。
直接使用大量的冗余信息(類似但不限于CSS布局等)箱叁。

使用Android webview.

content 是html的字符串

    webview.loadData(Html.fromHtml(content).toString(), "text/html", "UTF-8");

成功加載虱而。

這就完了嗎氨肌。當(dāng)然沒有,又出現(xiàn)了以下幾個回合的較量:

Round 1

發(fā)現(xiàn)沒有圖片廓鞠,仔細一看是圖片地址不是全路徑的帚稠,是相對路徑,缺少資源的相對根路徑床佳。

查了一下滋早,Webview有個loadDataWithBaseURL方法

public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

baseUrl可以指定HTML代碼片段中相關(guān)資源的相對根路徑。把根路徑即webhost放進去砌们。

String data = Html.fromHtml(content).toString();
webview.loadDataWithBaseURL("http://webhost.net", data, "text/html", "UTF-8", null);

解決問題杆麸。

round 2

由于html 的字符串中間穿插很多圖片的尺寸是不定的,造成了部分圖片是超過了屏幕浪感,

解決辦法:
使用replace方法把 img width全部替換為100%

  String data = Html.fromHtml(content).toString();
   data = data.replaceAll("width=\"\\d+\"", "width=\"100%\"").replaceAll("height=\"\\d+\"", "height=\"auto\"");
  webview.loadDataWithBaseURL("http://webhost.net", data, "text/html", "UTF-8", null);

注:
"\d+"" 是正則表達式角溃,\d 是匹配一個數(shù)字(0到9),+ 是表示多個合起來是 \d+ 就表示多個數(shù)字篮撑。前邊多一個\ 為了轉(zhuǎn)義减细。

round 3

發(fā)現(xiàn)部分圖片 的html 標(biāo)簽 沒有定義 width 和hight 屬性,默認(rèn)的還是圖像大小赢笨,造成了還是圖片沒有適應(yīng)屏幕未蝌。

解決思路:找到所有的img 標(biāo)簽把它的寬高屬性全部重置定死驮吱。
添加了一句js 代碼。

String varjs = "<script type='text/javascript'> \nwindow.onload = function()\n{var $img = document.getElementsByTagName('img');for(var p in  $img){$img[p].style.width = '100%'; $img[p].style.height ='auto'}}</script>";

這句js 代碼很簡單(\n 只是換行)找到所有的img 標(biāo)簽 遍歷 替換寬為屏幕的100% 高度自適應(yīng)萧吠。
當(dāng)然webview要設(shè)置支持js.

 webview.getSettings().setJavaScriptEnabled(true);
  String varjs = "<script type='text/javascript'> window.onload = function()
   {var $img = document.getElementsByTagName('img');for(var p in  $img){$img[p].style.width = '100%'; $img[p].style.height ='auto'}}</script>";
  webview.loadDataWithBaseURL("http://webhost.net", varjs + data, "text/html", "UTF-8", null);

round 4

實現(xiàn)點擊查看圖片

思路使用interface 拿到圖片的url.
定義官方給的:

 public class JavascriptInterface {
    @android.webkit.JavascriptInterface//注解必須需要
    public void startPhotoActivity(String imageUrl) {
        //此處根據(jù)url 實現(xiàn)圖片大圖預(yù)覽左冬。
    }
}

webview代碼及js實現(xiàn):

  webview.getSettings().setJavaScriptEnabled(true);
  webview.addJavascriptInterface(new JavascriptInterface(), "mainActivity");
  String jsimg = "function()\n { var imgs = document.getElementsByTagName(\"img\");for(var i = 0; i < imgs.length; i++){  imgs[i].onclick = function()\n{mainActivity.startPhotoActivity(this.src);}}}";
  webview.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView webView, String s) {
                webview.loadUrl("javascript:(" + jsimg + ")()");
            }
        });

語句很簡單,每一個img 都添加點擊事件傳遞它的資源url.

完整的 實現(xiàn)片段:

      private void load() {

        webview.getSettings().setJavaScriptEnabled(true);
        webview.addJavascriptInterface(new JavascriptInterface(), "mainActivity");

        String data = Html.fromHtml(content).toString();
         //替換img屬性
        String varjs = "<script type='text/javascript'> \nwindow.onload = function()\n{var $img = document.getElementsByTagName('img');for(var p in  $img){$img[p].style.width = '100%'; $img[p].style.height ='auto'}}</script>";

        //點擊查看
        String jsimg = "function()\n { var imgs = document.getElementsByTagName(\"img\");for(var i = 0; i < imgs.length; i++){  imgs[i].onclick = function()\n{mainActivity.startPhotoActivity(this.src);}}}";

        webview.loadDataWithBaseURL("http://www.youwebhost.com", varjs + data, "text/html", "UTF-8", null);

        webview.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView webView, String s) {
                webview.loadUrl("javascript:(" + jsimg + ")()");
            }
        });
   
    }

}

public class JavascriptInterface {
    @android.webkit.JavascriptInterface
    public void startPhotoActivity(String imageUrl) {
        //根據(jù)URL查看大圖邏輯 

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纸型,一起剝皮案震驚了整個濱河市拇砰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狰腌,老刑警劉巖除破,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琼腔,居然都是意外死亡瑰枫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門丹莲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來光坝,“玉大人,你說我怎么就攤上這事甥材《⒘恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵洲赵,是天一觀的道長土铺。 經(jīng)常有香客問我,道長板鬓,這世上最難降的妖魔是什么悲敷? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俭令,結(jié)果婚禮上后德,老公的妹妹穿的比我還像新娘。我一直安慰自己抄腔,他們只是感情好瓢湃,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赫蛇,像睡著了一般绵患。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悟耘,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天落蝙,我揣著相機與錄音,去河邊找鬼。 笑死筏勒,一個胖子當(dāng)著我的面吹牛移迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播管行,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厨埋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捐顷?” 一聲冷哼從身側(cè)響起荡陷,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迅涮,沒想到半個月后废赞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡逗柴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年蛹头,在試婚紗的時候發(fā)現(xiàn)自己被綠了顿肺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏溺。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屠尊,靈堂內(nèi)的尸體忽然破棺而出旷祸,到底是詐尸還是另有隱情,我是刑警寧澤讼昆,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布托享,位于F島的核電站,受9級特大地震影響浸赫,放射性物質(zhì)發(fā)生泄漏闰围。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一既峡、第九天 我趴在偏房一處隱蔽的房頂上張望羡榴。 院中可真熱鬧,春花似錦运敢、人聲如沸校仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄沫。三九已至,卻和暖如春卦方,著一層夾襖步出監(jiān)牢的瞬間羊瘩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留困后,地道東北人乐纸。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像摇予,于是被迫代替她去往敵國和親汽绢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355