Android 使用WebView 加载新闻详情,添加点击图片的js(使用的腾讯的X5内核) (三)

5 篇文章 0 订阅

前面两篇文章,主要实现了X5内核的WebView 播放视频,这一篇主要是加载html 代码。

X5WebView


public class X5WebView extends WebView {

    private OnTopicLoadCallback callback;//加载完成后,回调


    TextView title;
    private WebViewClient client = new WebViewClient() {
        /**
         * 防止加载网页时调起系统浏览器
         */
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageFinished(WebView webView, String s) {
            super.onPageFinished(webView, s);


       //渲染完成后,添加js
            addImageClickListener(webView);
            if (!Util.isNull(callback)) {
                callback.onContentLoadOK();
            }
            //获取加载进度

        }
    };
    /**
     * 给图片添加点击事件
     *
     * @param webView
     */
    private void addImageClickListener(WebView webView) {
        webView.loadUrl("javascript:(function(){" +
                "var objs = document.getElementsByTagName(\"img\"); " +
                "for(var i=0;i<objs.length;i++)  " +
                "{"
                + "    objs[i].onclick=function()  " +
                "    {  "
                + "        window." + MJavascriptInterface.FUNCTIONNAME + ".openImage(this.src);  " +//通过js代码找到标签为img的代码块,设置点击的监听方法与本地的openImage方法进行连接
                "    }  " +
                "}" +
                "})()");
    }

    WebChromeClient webChromeClient =new WebChromeClient(){

        @Override
        public void onProgressChanged(WebView webView, int newProgress) {
            super.onProgressChanged(webView, newProgress);
            if (!Util.isNull(callback)) {
                if (newProgress == 100) {
                    callback.onContentLoadOK();
                } else if (newProgress > 0 || newProgress < 100) {
                    callback.onLoadingProgress(newProgress);
                }
            }
        }
    };
    @SuppressLint("SetJavaScriptEnabled")
    public X5WebView(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
        this.setWebViewClient(client);
//         this.setWebChromeClient(webChromeClient);
        // WebStorage webStorage = WebStorage.getInstance();
        initWebViewSettings();

        this.getView().setClickable(true);
    }



    private void initWebViewSettings() {
        WebSettings webSetting = this.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        webSetting.setAllowFileAccess(true);
        webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
        webSetting.setSupportZoom(true);
        webSetting.setBuiltInZoomControls(true);
        webSetting.setUseWideViewPort(true);
        webSetting.setSupportMultipleWindows(true);
        // webSetting.setLoadWithOverviewMode(true);
        webSetting.setAppCacheEnabled(true);
        // webSetting.setDatabaseEnabled(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setGeolocationEnabled(true);
        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
        // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
        // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
        webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

        // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
        // settings 的设计
    }

    @Override
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        boolean ret = super.drawChild(canvas, child, drawingTime);
        return ret;
    }

    public X5WebView(Context arg0) {
        super(arg0);
        setBackgroundColor(85621);
    }


    /**
     * 加载视频url
     * @param videoUrl
     */
    public void loadVideoUrl(String videoUrl) {

        if (videoUrl.contains("html?")&&videoUrl.contains("iqiyi")) {
            String[]  urls=videoUrl.split("html?");
//          url=  urls[0]+"autoPlay=true&vid="+urls[1];
            videoUrl=  urls[0]+"html?rel=0&autoplay=1&"+urls[1];

        }

        loadUrl(videoUrl);

    }

    public void setLoadWebViewCallback(OnTopicLoadCallback callback) {
        this.callback = callback;
    }
}

自定义NewsContentWebView,继承自前面的X5WebView

使用NewsContentWebView的loadRenderedContent(String data),data就是接口中返回的html 内容代码。

public class NewsContentWebView extends X5WebView {

    private static final String HTML_0 = "" +
            "<!DOCTYPE html>\n" +
            "<html>\n" +
            "<head>\n" +
            "<meta charset=\"UTF-8\">\n" +
            "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\">\n";

    private static final String LIGHT_THEME_CSS = "<style type=\"text/css\">.reply img{\n" +
            "  display: inline-block;\n" +
            "  vertical-align: middle;\n" +
            " }"
            +
            " img {\n" +
//            "        margin: 10px 0;\n" +
            "width:100%;" +
            "height:auto;" +
            "    }" +
            "</style>";
    private static final String HTML_1 = "" +
            "</head>\n" +
            "<body>\n" +
            "<div class=\"reply\"  id=\"markdown-container\">\n";

    private static final String HTML_2 = "" +
            "</div>\n" +

            "</body>\n" +
            "</html>";

    public NewsContentWebView(@NonNull Context context) {
        super(context);
        init(context);
    }

    public NewsContentWebView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    @SuppressLint({"AddJavascriptInterface", "JavascriptInterface"})
    private void init(@NonNull Context context) {
        LogUtils.e("添加javaScript");
//        addJavascriptInterface(ImageJavascriptInterface.with(context),       ImageJavascriptInterface.NAME);


    }


    @NonNull
    protected String getThemeCssHtmlSlice() {
        return LIGHT_THEME_CSS;
    }

    public void loadRenderedContent(String data) {

        data = HTML_0 + getThemeCssHtmlSlice() + HTML_1 + data + "\n" + HTML_2;
        loadDataWithBaseURL(null, data, "text/html", "utf-8", null);
        //设置点击图片进入查看图片的界面
        String[] imageUrls = StringUtils.returnImageUrlsFromHtml(data);

        /**
         * 添加javascriptInterface
         * 第一个参数:这里需要一个与js映射的java对象
         * 第二个参数:该java对象被映射为js对象后在js里面的对象名,在js中要调用该对象的方法就是通过这个来调用
         */
        addJavascriptInterface(new MJavascriptInterface(getContext(), imageUrls), MJavascriptInterface.FUNCTIONNAME);
    }
}

MJavascriptInterface

这就是我们加入的js

public class MJavascriptInterface {
    private Context context;
    private String[] imageUrls;

    public static final String FUNCTIONNAME = "imagelistener";

    public MJavascriptInterface(Context context, String[] imageUrls) {
        this.context = context;
        this.imageUrls = imageUrls;
    }

    @SuppressLint("JavascriptInterface")
    @JavascriptInterface
    public void openImage(String img) {
        Intent intent = new Intent();
        intent.putExtra("imageUrls", imageUrls);
        intent.putExtra("curImageUrl", img);
        intent.setClass(context, PhotoBrowserActivity.class);
        context.startActivity(intent);
        for (int i = 0; i < imageUrls.length; i++) {
            Log.e("图片地址" + i, imageUrls[i].toString());
        }
    }
}

通过这样的方法,就给WebView中注入了JS 实现我们的点击图片的事件。

参考文章
Android 实现WebView点击图片查看大图列表及图片保存功能

Android 抛弃原生WebView,使用腾讯X5内核、并加入广告拦截。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
腾讯X5内核是一款支持多进程、支持硬件加速、支持自定义内核扩展的WebView内核。在Android开发中,使用腾讯X5内核可以提高WebView的性能和稳定性,下面是一些优化和实践总结: 1. 引入腾讯X5内核 引入腾讯X5内核需要在项目中添加相应的依赖库,然后在代码中进行初始化和使用。具体步骤可以参考腾讯官方文档。 2. 启用硬件加速 在使用腾讯X5内核时,可以启用硬件加速来提高WebView的渲染速度。具体可以通过设置WebView的LayerType属性来实现,例如: ``` webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); ``` 3. 使用加载加载可以在用户点击链接之前就开始加载下一页的内容,以提高用户体验和减少页面加载时间。腾讯X5内核提供了预加载功能,可以通过设置WebView的预加载模式来实现,例如: ``` webView.getX5WebViewExtension().setPageCacheCapacity(5); // 设置最大缓存页面数为5 webView.getX5WebViewExtension().setPreload(true); // 开启预加载模式 ``` 4. 优化JSBridge通信 JSBridge是一种用于WebView和Native代码之间通信的技术,但是在使用过程中容易出现性能问题。为了优化JSBridge通信,可以使用腾讯X5内核提供的基于V8引擎的JSBridge,它可以提高通信效率和稳定性。 5. 避免WebView内存泄漏 在使用WebView时,需要注意避免内存泄漏问题。具体可以通过以下方式来避免: - 及时释放WebView对象 - 使用静态内部类或弱引用来持有WebView对象 - 在Activity的onDestroy()方法中调用WebView的destroy()方法 总之,腾讯X5内核是一款非常强大的WebView内核,可以帮助我们优化WebView的性能和稳定性。在使用中,需要注意以上几点优化和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值