美文网首页带修改-安卓深入学习
android webview JS交互以及webview和te

android webview JS交互以及webview和te

作者: 大志Danny | 来源:发表于2017-09-29 13:17 被阅读59次

    最近项目有个需求:用户可能在应用内任何地方输入一个网址,这个网址带有固定标识参数来告知是一个小游戏或者其它,需要这个网址跳往app内部的webview,同时和JS有数据交互。由于之前对于应用内webview展示的地方是加载html片段,所以用户输入的链接地址没有做处理,尤其是textview没有加超链接和webview直接输入网址没有加A标签,导致都是纯文本而不能点击,所以项目要解决问题有以下:

    1.webview的文本内容通过正则来匹配出所有网址,并手动加上A标签,这样就可点击了。同时拦截点击跳往应用内部的webview页面。

    2.textview加入超链接,同时拦截跳转到应用内部webview页面。

    3.webview JS交互

    首先用正则匹配出文本内的所有网址并且加上A标签

    public static ArrayList<String> getCompleteUrl(String text) {
        ArrayList<String> urls = new ArrayList<String>();
        Pattern p = Pattern.compile("((http|ftp|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?", Pattern.CASE_INSENSITIVE);
        Matcher matcher = p.matcher(text);
        while (matcher.find()){
            String url = matcher.group();
            if (url.contains("drawgame=1")){//只给游戏加
                urls.add(url);
            }
        }
        return urls;
    }
    

    加上A标签这样就可以点击了

                for (int i = 0; i < urlList.size(); i++) {//把链接地址加上A标签
                    String reString = "<a href=\""+urlList.get(i)+"\">"+urlList.get(i)+"</a>";
                    content = content.replace(urlList.get(i),reString);
                }
    

    然后是Textview加超链接并且拦截点击事件

    public static void interceptHyperLink(Context mContext,TextView tv) {
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        CharSequence text = tv.getText();
        if (text instanceof Spannable) {
            int end = text.length();
            Spannable spannable = (Spannable) tv.getText();
            URLSpan[] urlSpans = spannable.getSpans(0, end, URLSpan.class);
            if (urlSpans.length == 0) {
                return;
            }
    
            SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
            // 循环遍历并拦截 所有http://开头的链接
            for (URLSpan uri : urlSpans) {
                String url = uri.getURL();
                if (url.indexOf("http://") == 0) {
                    CustomUrlSpan customUrlSpan = new CustomUrlSpan(mContext,url);
                    spannableStringBuilder.setSpan(customUrlSpan, spannable.getSpanStart(uri),
                            spannable.getSpanEnd(uri), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                }
            }
            tv.setText(spannableStringBuilder);
        }
    }
    

    public class CustomUrlSpan extends ClickableSpan {
    private Context context;
    private String url;
    public CustomUrlSpan(Context context,String url){
    this.context = context;
    this.url = url;
    }
    @Override
    public void onClick(View widget) {
    //自定义点击事件
    }
    }

    自定义UriSpan

    然后是JS交互

    // 定制和web交互
    public class HandleJSCallback {
        public HandleJSCallback() {
        }
    
        @JavascriptInterface
        public void choseLocalImg() {
            choseImg(false);
        }
    
        @JavascriptInterface
        public void getLocation() {
            startTencentLocation();
        }
    
        @JavascriptInterface
        public void openQrcode() {//扫描二维码
            scanQRcode();
        }
    
        @JavascriptInterface
        public void uploadImage(String jsonParams){//指定的裁剪
            doImageNext(jsonParams);
        }
        @JavascriptInterface
        public void finishPager() {//关闭页面
            SuperCreateHtmlSeePager.this.finish();
        }
    
        @JavascriptInterface
        public void addUserScore(int score){//操作分数
            Message msg = new Message();
            msg.what = 1;
            msg.arg1 = score;
            mHandler.sendMessage(msg);
        }
    
    }
    

    mWebview.addJavascriptInterface(new HandleJSCallback(), "android");

    以下为webview拦截链接点击

    mWebView.setWebViewClient(new MyWebViewClient(mContext));

       private Context mContext;
    public MyWebViewClient(Context context){
        mContext = context;
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null) {//自定义跳转
            
            
            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }
    
    @Override
    public void onPageFinished(WebView view, String url) {
        view.getSettings().setJavaScriptEnabled(true);
        super.onPageFinished(view, url);
    }
    

    相关文章

      网友评论

        本文标题:android webview JS交互以及webview和te

        本文链接:https://www.haomeiwen.com/subject/zzriextx.html