欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 中使用WebView

程序员文章站 2022-06-04 14:49:48
...
作用:显示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");