码迷,mamicode.com
首页 > 移动开发 > 详细

Android--webView嵌套网页

时间:2015-10-01 11:34:51      阅读:445      评论:0      收藏:0      [点我收藏+]

标签:

webView嵌套网页

因为某种原因,我们总是需要展示一些复杂的文本,Html.fromHtml()已经不能满足我们的需求,比如后台可编辑的文本在前端显示起来比较吃力,所以为了解决一些复杂的文本显示就需要用到WebView。

通过phongGap或者extjs jquery mobile等等的移动开发平台开发
其原理就是将一个用HTML5开发的程序通过各种平台打包成apk ios winPhone等等的平台的应用

WebView 主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL.
  1、LoadUrl            直接加载网页、图片并显示.(本地或是网络上的网页、图片、gif)
  2、LoadData           显示文字与图片内容 (模拟器1.5、1.6)
  3、LoadDataWithBase  显示文字与图片内容(支持多个模拟器版本)

1.WebView

   在使用WebView控件时,首先需要在xml布局文件中定义一个WebView控件,定义的方法如下:

这里是要有网络权限的

 

<WebView 
   android:id="@+id/webView"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>

(1)anGoBack()                   判断是否能够从该网页返回上一个打开的网页

(2)getTitle()、getUrl()        获得当前网页的标题和URL路径

(3)loadUrl(String url)         加载所要打开的网页等等。如下的代码通过使用loadUrl()方法在WebView控件中打开了百度主页。

    private WebView mWebView;
    mWebView = (WebView)this.findViewById(R.id.webView);
    mWebView.loadUrl("http://www.baidu.com/");

 2.WebSettings

   WebSettings用来设置WebView的属性状态。WebSettings和WebView存在于同一个生命周期中,可以使用如下的方法获得WebSettings对象

  WebSettings webSettings = mWebView.getSettings();

 

在创建WebView时,系统会对WebView进行一些默认设置,当我们通过以上的方法得到WebSettings对象后,便可以从WebSettings对象中取出设置WebView的属性和状态

WebSettings提供的一些常用的设置WebView的属性和状态的方法如下:

  (1)setAllowFileAccess(boolean allow);        //设置启用或禁止访问文件数据

  (2)setBuiltInZoomControls(boolean enabled);   //设置是否支持缩放

  (3)setDefaultFontSize(int size);            //设置默认的字体大小

  (4)setJavaScriptEnabled(boolean flag);       //设置是否支持JavaScript

  (5)setSupportZoom(boolean support);       //设置是否支持变焦

3.WebViewClient

WebViewClient主要用来辅助WebView处理各种通知、请求等事件。实现了让新打开的网页在当前的WebView中进行显示,而不是调用Android系统自带的浏览器进行访问。

        webView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                //如果返回true用webView去打开,为false调用系统浏览器或第三方浏览器。
                return true;
            }
        });

 

 

我们可以通过WebView的setWebViewClient()方法,为WebView对象指定一个WebViewClient

        MyWebViewClient myWebViewClient = new MyWebViewClient();
        mWebView.setWebViewClient(myWebViewClient);
        private class MyWebViewClient extends WebViewClient {
            //重写父类方法,让新打开的网页在当前的WebView中显示
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        }

可以看到,在如上的代码中,我们通过在子类MyWebViewClient中重写父类WebViewClient的shouldOverrideUrlLoading()方法,

在WebViewClient中同样提供了很多的方法,比如以下一些:

  (1)doUpdateVisitedHistory(WebView view, String url, boolean isReload);             //更新历史记录

  (2)onFormResubmission(WebView view, Message dontResend, Message resend);        //重新请求网页数据

  (3)onLoadResource(WebView view, String url);                       //加载指定网址提供的资源

  (4)onPageFinished(WebView view, String url);                        //网页加载完毕

  (5)onPageStarted(WebView view, String url, Bitmap favicon);               //网页开始加载

  (6)onReceivedError(WebView view, int errorCode, String description, String failingUrl);  //报告错误信息

4.WebChromeClient

WebChromeClient主要用来辅助WebView处理Javascript的对话框、网站图标、网站标题以及网页加载进度等。

同样地,我们可以通过WebView的setWebChromeClient()方法,为WebView对象指定一个WebChromeClient。

在WebChromeClient中,

当网页的加载进度发生变化时,onProgressChanged(WebView view, int newProgress)方法会被调用;

当网页的图标发生改变时,onReceivedIcon(WebView view, Bitmap icon)方法会被调用;

当网页的标题发生改变时,onReceivedTitle(WebView view, String title)方法会被调用。

利用这些方法,我们便可以很容易的获得网页的加载进度、网页的标题和图标等信息了,正如下面的代码所示:

        MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
        mWebView.setWebChromeClient(myWebChromeClient);

        private class MyWebChromeClient extends WebChromeClient {

            //获得网页的加载进度,显示在右上角的TextView控件中
            public void onProgressChanged(WebView view, int newProgress) {
                if(newProgress < 100) {
                    String progress = newProgress + "%";
                    mTextView_progress.setText(progress);
                } else {
                    mTextView_progress.setText(" ");
                }
            }

            //获得网页的标题,作为应用程序的标题进行显示
            public void onReceivedTitle(WebView view, String title) {
                MainActivity.this.setTitle(title);
            }
        }

5.WebView与Javascript

  在WebView中不仅可以运行HTML代码,更重要的是,WebView可以与Javascript互相调用。也就是说,在Javascript中可以获取WebView的内容,与此同时,在WebView中也可以调用Javascript里面的方法。

  下面就来说说如何在WebView中调用Javascript里面的方法。

  这里,我使用了百度地图的API接口(一份内嵌了Javascript的HTML文档),在该接口中提供如下的Javascript方法:

     /*********************************/
     /*           查找地点            */
     /*********************************/
     var city = new BMap.LocalSearch(map,{renderOptions:{map:map,autoViewport:true}});   
     
     function findPlace(place)
     {
         city.search(place);
   }

 

 

   我们要做的就是在WebView中调用findPlace()方法,完成地点的查找。在WebView中调用Javascript里面的方法是通过代码WebView.loadUrl(“javascript:方法名()”)来实现的。如下的代码,从EditText控件中获得用户想要查找的地名,然后调用了Javascript中的findPlace()方法,进行查找。

     public void onClick(View view) {
         switch(view.getId()) {
         case R.id.imagebutton_search:                    //查找地名
             String str = mEditText_input.getText().toString();
             String url = "javascript:findPlace(‘" + str + "‘)";
             mWebView.loadUrl(url);
             break;
         }
     }

 

   比如,我们对“圆明园”进行查找,可以看到如图2所示的查找结果。 

技术分享 

 

 

WebView in ScrollView

我们都知道ScrollView和WebView都有滚动的效果,所以我们需要先屏蔽WebView的滚动事件

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants" >

中文乱码

如果出现中文乱码,你可以这样设置

webView.loadData(body, "text/html; charset=utf-8", "utf-8");

 

Auto Scale

这时候如果后端如果传过来的不是完整的Html,而是只有body部分的内容,那么我们就需要补充并添加一些css样式来达到自适应的效果。

WebView webView = new WebView(this);
webView.setWebViewClient(new SimpleWebViewClient(title));
        webView.getSettings().setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);
} else {
     webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
}
webView.loadData(getHtmlData(body), "text/html; charset=utf-8", "utf-8");

 

别忘了头部的设定:

private String getHtmlData(String bodyHTML) {
    String head = "<head>" +
                "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\"> " +
                "<style>img{max-width: 100%; width:auto; height:auto;}</style>" +
                "</head>";
    return "<html>" + head + "<body>" + bodyHTML + "</body></html>";
}

 

如何控制WebView的高度,没想到WebView可以自己适应内容最长的高度。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Android--webView嵌套网页

标签:

原文地址:http://www.cnblogs.com/zrui513/p/4850736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!