webView在不同接口数据中的使用情况

1 WebView最简单的使用,加载一个url路径,代码如下:

   wv_all = (WebView) findViewById(R.id.wv_all);

    // 重新设置websettings ,否则有可能加载不出来页面,或者加载出来的页面不完整的问题
        WebSettings s = wv_all.getSettings();
        s.setBuiltInZoomControls(true);
        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        s.setUseWideViewPort(true);
        s.setLoadWithOverviewMode(true);
        s.setSavePassword(true);
        s.setSaveFormData(true);
        s.setJavaScriptEnabled(true);
        // enable navigator.geolocation
        s.setGeolocationEnabled(true);
        s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

     wv_all.loadUrl(UrlContansts.Find_YingShiJu_All+"?userid="+XingZhiApplication.getInstance().userid+"&type=电视剧");

      通常我们会为webview注册一个监听,监听其变化的过程,如下:

     wv_all.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
               //webview加载完成后所调用的回调方法
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                // TODO Auto-generated method stub
                super.onPageStarted(view, url, favicon);
               //webview加载开始时所调用的回调方法
            }
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 监听所有点击的链接,如果拦截到我们需要的,就跳转到相对应的页面。
                if (url != null && url.contains("MoviesInfo")) {
                    Intent intent = new Intent(mContext, FindPingLunActivity.class);
                    intent.putExtra("url", url);
                    intent.putExtra("flag", "0");
                    mContext.startActivity(intent);
                    return true;
                }  
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

2 如果服务器接口返回的不是一个完成的url路径,而是一个完整的html代码(即包含html标签,body标签等),处理方式如下:

     在请求服务器接口成功的回调方法中加上下面的代码:

    

      try {
                    FileWriter fw = new FileWriter("sdcard/test8.htm");//保存到sd卡上,且名字为test8.htm,后缀名必须为htm
                    fw.append(arg0.result);
                    fw.flush();
                    fw.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        wv_web.loadUrl("file://"+"/mnt/sdcard/"+"test8.htm");//通过loadUrl加载sd卡上的text8.htm,除了htm名是变化的,前面都是固定的格式,否则你会找不到htm而显示不出来

     如果确定上面的代码没有用错,还是没有加载出来,那么就在初始化webview的地方加上下面的监听:

     //设置下面的属性,就是为了加载服务器返回的htm5页面
        wv_web.setWebViewClient(new WebViewClient());

3  如果服务器返回的是包含有如
,< >等html格式的字符串,但不是完整的html代码时,处理方式有如下两个方式:

   3.1

         wv.setVerticalScrollBarEnabled(false);
        wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        wv.setScrollContainer(false);
        wv.setScrollbarFadingEnabled(false);
        wv.getSettings().setUseWideViewPort(true);
        wv.setBackgroundColor(0); // 设置背景色,注意要在xml布局文件中对webview设置background,否则程序运行会崩溃。
        wv.getBackground().setAlpha(0); // 设置填充透明度 范围:0-255
        wv.getSettings().setDefaultTextEncodingName("UTF-8");
        
        WebSettings ws = wv.getSettings();
        ws.setDefaultFontSize(15);//设置webview上字体的大小。很可惜没有设置字体颜色的方法。

       wv.loadDataWithBaseURL(null,"", "text/html","utf-8", null);

     通过上面的loadDataWithBaseURL方法就加载成功了。其中aboutUs.Data.get(0)._introduction就是接口所返回的包含有一些html标签的字符串。之所以在字符串的外面加了

     3.2

       第二个方法处理起来非常的简单,不用webview,而是用textview,一句话就搞定了,远远的比第一个方法简便的多了

      tv_name_content.setText(Html.fromHtml(aboutUs.Data.get(0)._introduction));

     其中tv_name_content就是xml布局中定义的一个控件(不用定义webview了哦),然后将接口返回的数据通过方法Html.fromHtml()直接就显示在手机上,而且是有标签对应的格式的。很是完美。

4 最后说一下Android和javascript的交互问题

     4.1 js调用android中的方法,实例如下:

       webview.addJavaScriptInterface(new object(){

            public void showToast(String content){

                   System.out.println("交互后得到的js传递过来的数据为:"+content);

                 }

        },"android");

        解释:这里有两个地方是相对变化的,

           第一:双引号中的android,其只是一个标识,用于被h5所识别,可以随便写。但是你写成什么,那么必须告诉h5,因为h5必须用该标识调用另外一个可以变化的地方:showToast方法

           第二:第一步中说到的showToast方法也是可以随便写的,写好之后告诉h5,他们会调用这个方法的,而方法中的参数就是你们二者之间数据传递的桥梁,交互的重点就是拿到这个参数数据。

        4.2 android中调用js,实例:

            webview.loadUrl("javascript:changeInputValue('hellow 世界')");

          其中重点是格式必须是:javascript:且小写。然后changeInputValue('hellow 世界')是h5中写好的方法,参数hellow 世界 是我们要传递的参数,这样我们就把数据:hellow 世界 传递给了js,即完成了android中调用js的交互。

你可能感兴趣的:(JS和安卓互调,WebView)