Androdi开发之WebView学习总结

Open Declaration概述:

              android.webkit.WebView(网络视图)是View的一个子类,能加载网页,也可以视为一个浏览器来使用!WebView内部实现是采用渲染引擎来展示View的内容,提供网页前进后退,网页放大,缩小,搜索,前端开发者可以使用web inspector()调试Html,CSS,Javascript等等功能。在Android4.3系统及其以下WebView内部采用WebKit渲染引擎,在Android4.4采用chromium渲染引擎来渲染View的内容。

  • WebView的基本使用:

          需要在AndroidManifest.xml文件中添加权限,否则出现Web page not available错误。

           <uses-permission       android:name="android.permission.INTERNET"/>

  1. 实例化WebView
    1. 在Activity中实例化WebView组件:WebView  mWebView=new WebView(Activity.this);
    2. 在xml布局文件中声明WebView,在Activity中实例化WebView;
  2. 调用WebView的loadUrl()方法,设置要显示的网页: 
  3. 互联网:mWebView.loadUrl("http://www.baidu.com");
  4. 本地文件:
    1. 存于assets下:mWebView.loadUrl("file:///android_asset/XX.html");(注:android_asset不是文件名
    2. 存于sdcardx下:mWebView.loadUrl("content://com.android.htmlfileprovider/sdcard/XX.html");注意:content前缀可能导致异常,直接使用file:///sdcard/ or file:/sdcard也可以
  5. 调用Activity的setContentView( )方法来显示网页视图
  6. 用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键, 整个浏览器会调用finish()而结束自身,而不是回退到上一页面
  7. 实例代码:
           在Activity中实例化WebView组件
           
public class MainActivity extends ActionBarActivity{
    @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		init();
	}
    private void init(){
        //实例化WebView
        WebView mWebView=new WebView(MainActivity.this);
        //设置WebView属性,能够执行Javascript
        mWebView.getSettings(). webview.getSettings().setJavaScriptEnabled(true);  
        //加载需要显示的网页  
        webview.loadUrl("http://www.baidu.com/");  
        //设置Web视图  
        setContentView(webview); 
    }
       @Override 
    //设置回退  
    //覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {  
            webview.goBack(); //goBack()表示返回WebView的上一页面  
            return true;  
        }  
        return false;  
    }
           在xml布局文件中声明WebView,在Activity中实例化WebView
          
    
     
      
    
     
         
        
      
       
    
     
      
           mWebView=findViewById(R.id.webview);
  • WebView相关常用方法
  • 加载指定的data数据 :
public void loadData(String data,String mimeType,String encoding);(显示文字和图片内容(模拟器1.5、1.6))
参数说明:data 字符串String类型的数据 可以通过base64编码而来;
                mimeType data数据的MIME类型,eg:“text/html”
                eccoding data数据的编码类型, eg:“utf-8”
public void loadDataWithBase (String baseUrl,String data,String mimeType,String encoding,String historyUrl);( 显示文字与图片内容(支持多个模拟器版本 )
参数说明:baseUrl是一个标志位,用来标志当前页面的Key值的,而historyUrl就是一个value值,在加载时,它会把baseUrl和historyUrl传到List列表中,当作历史记录来使用,当前进和后退时,它会通过baseUrl来寻找historyUrl的路径来加载historyUrl路径来加载历史界面,需要注意的就是history所指向的必须是一个页面,并且页面存在于SD卡中或程序中(assets),loadDataWithBaseURL,它本身并不会向历史记录中存储数据,要想实现历史记录,需要我们自己来实现。(其他参数与loadData一样)
  • 如果webView中需要用户手动输入用户名、密码等,则webView必须设置支持获取焦点
    mWebView.requestFocusFromTouch();
  • WebSettings的常用方法介绍

WebSettings webSettings = mWebView .getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true);webSettings.setSupportZoom(true);

webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
webSettings.setLoadWithOverviewMode(true);
setJavaScriptEnabled(true);  //支持js

setPluginsEnabled(true);  //支持插件 

setUseWideViewPort(false);  //将图片调整到适合webview的大小 

setSupportZoom(true);  //支持缩放 

setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局  

supportMultipleWindows();  //多窗口 

setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //关闭webview中缓存 

setAllowFileAccess(true);  //设置可以访问文件 

setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点

webview webSettings.setBuiltInZoomControls(true); //设置支持缩放 

setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 

setLoadWithOverviewMode(true); // 缩放至屏幕的大小

setLoadsImagesAutomatically(true);  //支持自动加载图片
  • WebViewClient 的方法全解

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

onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据)

onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。

onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。

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

onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求)
 
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。
 
onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用)

onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用)

shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。

shouldOverrideUrlLoading(WebView view, String url)
//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。

  • 硬件加速后webview闪烁问题

android webview 在3.0+后显示flash要启用硬件加速,开启硬件加速是在manifest中加入: android:hardwareAccelerated="true"

但是开启硬件加速后webview有可能会出现闪烁的问题,解决方法是在webview中设置:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }

  • WebView获取网页源码
  • 使用javascript:
webView.getSettings().setJavaScriptEnabled( true );
  • 编写本地接口:
private class InJavaScriptLocalObj {
    public void showSource(String html) {
        Log.d("HTML", html);
    }
}
  • 注册java脚本
webView.addJavascriptInterface(new InJavaScriptLocalObj (), "HTMLOUT");
  • 编写自己的WebViewClient类,在onPageFinished(WebView webview,String url)方法内抓取源码:
<span style="font-size:14px;">private class MyWebViewClient extends WebViewClient{  
    public boolean shouldOverrideUrlLoading(WebView view, String url) {   
        view.loadUrl(url);   
        return true;   
    }  
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        Log.d("WebView","onPageStarted");
        super.onPageStarted(view, url, favicon);
    }    
    public void onPageFinished(WebView view, String url) {
        Log.d("WebView","onPageFinished ");
        view.loadUrl("javascript:window.HTMLOUT.showSource('<head>'+" +
                "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
        super.onPageFinished(view, url);
    }
}</span>
关键处:
<span style="font-size:14px;color:#FF0000;">view.loadUrl("javascript:window.HTMLOUT.showSource('<head>'+" +
                "document.getElementsByTagName('html')[0].innerHTML+'</head>');");</span>



参考:http://www.cnblogs.com/zgz345/p/3768174.html
            http://blog.csdn.net/typename/article/details/39030091
非常感谢!


     

 
  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值