【W(wǎng)ebView】WebView為圖片添加點(diǎn)擊事件,查看webview中的多圖

  • why

在日常開發(fā)過程中,有時(shí)候會(huì)遇到需要在app中嵌入網(wǎng)頁既峡,此時(shí)使用WebView實(shí)現(xiàn)效果羡榴,但在默認(rèn)情況下是無法點(diǎn)擊圖片查看大圖的,更無法保存圖片运敢。本文將就這一系列問題的實(shí)現(xiàn)進(jìn)行說明校仑。

這里面主要還是用到了android原生和js交互的知識(shí)忠售、js添加事件的知識(shí)。

1迄沫、首先在andorid的頁面中獲取到html的字符串(bean.getContent())稻扬,然后在調(diào)用公共方法去獲取到網(wǎng)頁中的所有圖片數(shù)組集合。之后就是android原生與js交互的規(guī)則了羊瘩,如你所見泰佳,此處不再詳細(xì)介紹。

//這兩行copy出來尘吗,這個(gè)變量是WebView設(shè)置和js交互時(shí)設(shè)置的名稱逝她,可以隨意起,js調(diào)用的時(shí)候也用這個(gè)就可以了
public static final String  JSCALLJAVA= "jsCallJavaObj";
private String method = CommonUtil.JSCALLJAVA;

String[] imgs = JqStrUtil.returnImageUrlsFromHtml(bean.getContent());
web_course.addJavascriptInterface(new ImageJavascriptInterface(this,imgs), method);
web_course.setWebViewClient(new WebViewClient(){
       @Override
       public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            CommonUtil.setWebImageClick(view,method);
       }
 });

獲取圖片數(shù)組的方法睬捶,通過正則匹配來獲惹稹:

public static String [] returnImageUrlsFromHtml(String htmlCode) {
        List<String> imageSrcList = new ArrayList<String>();
        Pattern p = Pattern.compile("<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic|\\b)\\b)[^>]*>", Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(htmlCode);
        String quote = null;
        String src = null;
        while (m.find()) {
            quote = m.group(1);
            src = (quote == null || quote.trim().length() == 0) ? m.group(2).split("http://s+")[0] : m.group(2);
            imageSrcList.add(src);
        }
        if (imageSrcList.size() == 0) {
            return null;
        }
        return imageSrcList.toArray(new String[imageSrcList.size()]);
}

接下來是android原生和js交互的代碼:
(1) Java類,js會(huì)通過之前設(shè)置的名稱method來調(diào)用到其中的方法

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
/**
 * WebView與android交互的接口設(shè)置實(shí)現(xiàn)類
 * 1侧戴、可接口然后具體實(shí)現(xiàn)宁昭,然后在webview設(shè)置時(shí)具體實(shí)現(xiàn)
 * 2、也可以直接實(shí)現(xiàn)酗宋,這樣在同樣需求的地方就可以直接復(fù)用了
 * Created by dl on 2018/8/9.
 */
public class ImageJavascriptInterface {
    private Context context;
    private String[] imageUrls;

    public ImageJavascriptInterface(Context context, String[] imageUrls) {
        this.context = context;
        this.imageUrls = imageUrls;
    }
    //java回調(diào)js代碼积仗,不要忘了@JavascriptInterface這個(gè)注解,不然點(diǎn)擊事件不起作用
    @JavascriptInterface
    public void openImage(String img,int pos) {
        Intent intent = new Intent(context, PreviewImgActivity.class);//改為你要跳轉(zhuǎn)的頁面
        //具體要傳遞的參數(shù)自行傳遞即可
        intent.putExtra("currentItem",String.valueOf(pos));
        Bundle bundle = new Bundle();
        bundle.putStringArray("imgUrls",imageUrls);
        intent.putExtras(bundle);
        context.startActivity(intent);
    }
}

(2)
這段代碼是在onPageFinished網(wǎng)頁加載完成之后設(shè)置的蜕猫,其中主要是添加了一段js代碼寂曹,只有在網(wǎng)頁加載完成之后,才能從dom中獲取所有的img節(jié)點(diǎn)也就是圖片回右。至于本身前端寫的html中并沒有給img添加點(diǎn)擊的事件隆圆,所以我們來動(dòng)態(tài)給他添加進(jìn)去。
一般h5和原生交互翔烁,這段代碼可以直接h5來寫渺氧,你將你設(shè)置的java方法和起的名字告訴h5讓其寫進(jìn)去就可以(具體到下面代碼中就是method和openImage方法)

/**
     * 設(shè)置網(wǎng)頁中圖片的點(diǎn)擊事件
     * @param view
     *
     */
    public static void setWebImageClick(WebView view,String method) {
        String jsCode="javascript:(function(){" +
                "var imgs=document.getElementsByTagName(\"img\");" +
                "for(var i=0;i<imgs.length;i++){" +
                "imgs[i].pos = i;"+
                "imgs[i].onclick=function(){" +
                "window."+method+".openImage(this.src,this.pos);" +
                "}}})()";
        view.loadUrl(jsCode);
    }

上面代碼還需要一點(diǎn)說明:就是傳遞當(dāng)前圖片的位置問題,直接傳i是不行的蹬屹,好像有什么閉包的問題侣背,我查詢的時(shí)候也有一個(gè)網(wǎng)友對此作了很詳細(xì)的說明和解決方案的提供,傳送門慨默,我們這里采用的是給他設(shè)置一個(gè)屬性來解決

這里我最初想通過這里把圖片也賦值給一個(gè)屬性贩耐,然后將圖片數(shù)組傳到j(luò)ava的方法參數(shù)中,但是無論是用了閉包還是設(shè)置屬性厦取,java那邊總是接受不到潮太,這個(gè)疑問我至今不解,所以有知道的小伙伴兒還請不吝賜教,感激不盡啊铡买。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末更鲁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奇钞,更是在濱河造成了極大的恐慌岁经,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇券,死亡現(xiàn)場離奇詭異,居然都是意外死亡樊拓,警方通過查閱死者的電腦和手機(jī)纠亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筋夏,“玉大人蒂胞,你說我怎么就攤上這事√跖瘢” “怎么了骗随?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赴叹。 經(jīng)常有香客問我鸿染,道長,這世上最難降的妖魔是什么乞巧? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任纬凤,我火速辦了婚禮戳晌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己骄崩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布汁展。 她就那樣靜靜地躺著昙啄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪获三。 梳的紋絲不亂的頭發(fā)上旁蔼,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音石窑,去河邊找鬼牌芋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛松逊,可吹牛的內(nèi)容都是我干的躺屁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼经宏,長吁一口氣:“原來是場噩夢啊……” “哼犀暑!你這毒婦竟也來了驯击?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤耐亏,失蹤者是張志新(化名)和其女友劉穎徊都,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體广辰,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暇矫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了择吊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片李根。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖几睛,靈堂內(nèi)的尸體忽然破棺而出房轿,到底是詐尸還是另有隱情,我是刑警寧澤所森,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布囱持,位于F島的核電站,受9級(jí)特大地震影響焕济,放射性物質(zhì)發(fā)生泄漏纷妆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一吼蚁、第九天 我趴在偏房一處隱蔽的房頂上張望凭需。 院中可真熱鬧,春花似錦肝匆、人聲如沸粒蜈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枯怖。三九已至,卻和暖如春能曾,著一層夾襖步出監(jiān)牢的瞬間度硝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工寿冕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕊程,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓驼唱,卻偏偏與公主長得像藻茂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • 1辨赐、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,981評(píng)論 3 119
  • 其實(shí)我也一直想寫一些什么掀序。 每次卻又都提筆忘字帆焕, 忘得不是怎么去書寫, 而是如何去表達(dá)…… 我的經(jīng)歷就像這廈大的石...
    KT林閱讀 256評(píng)論 0 1
  • 江山一美人 文 | 劉深雨 ...
    一葉而知秋也閱讀 361評(píng)論 1 1
  • 最近項(xiàng)目中新增了一個(gè)分享pdf文件的的功能不恭,把一個(gè)界面以pdf文件的形式分享出去叶雹,剛開始接觸pdf,沒一點(diǎn)思路换吧,各...
    幽城88閱讀 866評(píng)論 0 0