Android webview使用详解
- 打开网页时不调用系统浏览器, 而是在本WebView中显示:
复制代码
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
复制代码 - 通过java代码调用javascript
复制代码
WebSettings webSettings = mWebView .getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Object() {
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
webview.loadUrl("javascript:wave()");
}
});
}
}, "demo");
复制代码 - 按返回键时, 不退出程序而是返回上一浏览页面:
复制代码
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
复制代码 - 打开页面时, 自适应屏幕:
WebSettings webSettings = mWebView .getSettings();
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
webSettings.setLoadWithOverviewMode(true); - 便页面支持缩放:
WebSettings webSettings = mWebView .getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);
6.如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
webview.requestFocusFromTouch();
7.WebView 加载界面主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL.
1、LoadUrl 直接加载网页、图片并显示.(本地或是网络上的网页、图片、gif)
2、LoadData 显示文字与图片内容 (模拟器1.5、1.6)
3、LoadDataWithBase 显示文字与图片内容(支持多个模拟器版本)
8.WebSettings 的常用方法介绍
复制代码
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); //支持自动加载图片
复制代码
9.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,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
1.webview布局文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" > </WebView> </LinearLayout>
2.MyActivity.class文件
package com.ncsyeyy.WebViewDemo; import android.app.Activity; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.view.KeyEvent; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import java.net.URLEncoder; public class MyActivity extends Activity { /** * WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用。 webview有两个方法:setWebChromeClient 和 setWebClient setWebClient:主要处理解析,渲染网页等浏览器做的事情 setWebChromeClient:辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 WebViewClient就是帮助WebView处理各种通知、请求事件的。 * 1、webview支持页面缩放,一般通过以下设置就可满足80%的要求 //缩放开关 webView.getSettings().setSupportZoom(true); 设置此属性,仅支持双击缩放,不支持触摸缩放(在android4.0是这样,其他平台没试过) // 设置是否可缩放 webView.getSettings().setBuiltInZoomControls(true); 如果设置了此属性,那么webView.getSettings().setSupportZoom(true);也默认设置为true 2、无限缩放 无限缩放,就需要使用大视图模式,如下: //无限缩放 webView.getSettings().setUseWideViewPort(true);设置此属性,可任意比例缩放。 注:1、初始缩放值可这样设置:webView.setInitialScale(initalValue); 2、缩放后,要使内容适配屏幕,不超出屏幕外显示,实现换行。这方面效果应该由html控制,而不是webview控制。 例如<p style="word-break:break-all">test</p>实现自动换行。 */ private WebView webView; @SuppressLint("SetJavaScriptEnabled") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webView = (WebView) findViewById(R.id.webview); WebSettings webSettings=webView.getSettings(); // 设置WebView属性,能够执行JavaScript脚本 webSettings.setJavaScriptEnabled(true); // 设置可以访问的文件 webSettings.setAllowFileAccess(true); // 设置是否支持缩放 webSettings.setBuiltInZoomControls(true); // webView.getSettings().setBuiltInZoomControls(true); // 缩放开关 webSettings.setSupportZoom(true); webSettings.setUseWideViewPort(true);//可以任意比例缩放 webSettings.setPluginState(WebSettings.PluginState.ON); webView.setSaveEnabled(true);//支持插件 //使用localStorage(本地存储)则必须打开 webSettings.setDomStorageEnabled(true); // 加载需要显示的网页本地,网络都可以,只需要把地址换一下即可 webView.loadUrl("file:///sdcard/ebook/mntusadmin/935867ec1f094f4e900a9920c4822e79/quiz/data/a14c682cab7a4d72b3296f4d14fd59fd/index.html?user_id=226e56111f8949329623a4dfc539dc51&client_type=android&style_type=Formative&Authorization=mntusadmin|6efbd902c18cfc84701d3bf915bcfc012fb1e7d258204b5b136e23e968fc877b7922572d7a6e08b339acfc2b34c3c9b5675c45cafa137211e9f07429636dea91&Language=zh-CN&admin_flag=Y"); // 打开网页时不调用系统浏览器,二十在本webview中显示设置web视图 webView.setWebViewClient(new webViewClient()); } //设置回退,覆盖activity类的onKeyDown(int keyCode,KeyEvent event)方法 // 按返回键是,不退出程序而是返回上一浏览页面 @Override public boolean onKeyDown(int keyCode,KeyEvent event){ if ((keyCode==KeyEvent.KEYCODE_BACK)&&webView.canGoBack()){ webView.goBack(); return true; } finish(); return false; } //Web视图 private class webViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器 return true; } } }
3.AndroidManifest.xml权限的配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ncsyeyy.WebViewDemo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="18"/> <!--添加访问网络权限--> <uses-permission android:name="android.permission.INTERNET"/> <!-- 允许应用访问精确(如GPS)性的定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!--允许应用访问范围(如WIFI)性的定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <activity android:name="MyActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>