Bootstrap

Android 中使用WebView

作用:显示html富文本的控件
--加载html :
loadData(String html,"text/html;charset=utf-8",null)   加载html网页内容
loadUrl(String url)    加载互联网的网页数据
loadUrl(String url,HashMap<String,String> headers)    加载网页,并带有请求头参数
loadUrl(String url)    加载互联网的网页数据



---基本设置
webView.getSettings().setJavaScriptEnabled(true);// 支持运行javascript

webView.setWebChromeClient(new WebChromeClient());// 支持运行特殊的javascript(例如:alert())

webView.setWebViewClient(new WebViewClient());// 当点击超链地址后不会新打开浏览器来访问,而是始终在本app中浏览页面

【注意:】
WebView除了可以加载服务器端的网页,还可以加载本地资产目录中的网页文件。网页文件格式为:”file:///android_asset/文件名称”。

WebSettings 作用: 通过上面的代码,可以实现WebView加载网页内容,但是对于HTML文本的Javascript代码却无法加载运行。为了解决这个问题要借助WebSettings类。WebSettings类除了可以设置是否支持Javascript外,还具有set系列方法来设置WebView的属性和状态。WebSettings对象通过WebView对象的getSettings()方法来获取。
怎么获得WebSettings:通过WebView对象的getSetting()方法

----WebSettings的基本用法:
setJavaScriptEnabled(boolean flag);  //设置是否支持js

setBlockNetworkImage(boolean flag)  //设置是否阻止网络图片加载

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

setFixedFontFamily(String font)  //设置固定使用的字体

setDefaultTextEncodingName(String encoding)  //设置解码时默认的字符集

setAllowFileAccess(boolean allow)   //设置是否允许访问WebView中文件。就是file:///android_asset和file:///android_res路径下的资产和资源文件。默认允许访问。

setLayoutAlgorithm(LayoutAlgorithm) //设置布局算法

setPluginsEnabled(true);  //支持插件 

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

setSupportZoom(boolean support)  //设置是否支持缩放

setBuiltInZoomControls(boolean enabled)  //将HTML文本内容加载到WebView中

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

supportMultipleWindows();  //多窗口 

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

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

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

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

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

setLoadsImagesAutomatically(true);  //支持自动加载图片

——WebViewClient作用: WebView解决了支持Javascript的问题。但是新的问题又出来了。当点击WebView中的超链接后,原本希望目标网页在当前WebView中显示,但是却打开了系统浏览器来加载目标网页。为了解决这个问题,要借助WebViewClient类。WebViewClient类专门用来辅助WebView处理各种通知、请求等事件。通过WebView对象调用setWebViewClient()方法来指定一个WebViewClient对象,重写WebViewClient对象中的shouldOverrideUrlLoading()方法,使得当有新连接时,使用当前WebView来显示网页。WebViewClient除此之外,还有其他的方法
——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,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
-------android端与JavaScript的交互:
android调用JS方法
    webView.loadUrl("javascript:方法名()");

JS调用android方法
1、android端创建一个类(例如MyJS),并且在该类中声明一个让js调用的方法(例如click)

2、在该方法上声明一个注解@JavascriptInterface

3、调用webview.addJavascriptInterface(new MyJS(this), "app");方法。

4、在JS端通过app.click();调用android端的方法

webview跟其他控件差不多,应用于控件时可以直接显示html

开发代码如下:

webView = (WebView) findViewById(R.id.webview);
//        webView.loadData(htmlstr, "text/html;charset=utf-8", null);


WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);//让WebView支持javascript
settings.setDefaultTextEncodingName("utf-8");//设置字符集
//        settings.setBlockNetworkImage(true);//设置不能访问网络图片
//        settings.setSupportZoom(true);//开启网页的缩放
//        settings.setBuiltInZoomControls(true);

//        settings.setLoadWithOverviewMode(true);//设置网页缩放至屏幕大小
//        settings.setUseWideViewPort(true);

webView.setWebViewClient(new WebViewClient(){

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.d("print", "请求连接的URL:" + url);
                return super.shouldOverrideUrlLoading(view, url);
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
                Log.d("print", "开始加载连接:" + url);
}

@Override
public void onPageFinished(WebView view, String url) {
                Log.d("print", "网页加载结束:" + url);
}
        });//所有请求在本地的webview打开

webView.setWebChromeClient(new WebChromeClient());//支持特殊的JavaScript
//        webView.loadUrl("http://www.17173.com");

webView.addJavascriptInterface(new MyJS(this), "android");

//加载本地网页
webView.loadUrl("file:///android_asset/login.html");
;