Android webview使用详解
1. 打开网页时不调用系统浏览器, 而是在本WebView中显示:
复制代码
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
复制代码
2. 通过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");
复制代码
3. 按返回键时, 不退出程序而是返回上一浏览页面:
复制代码
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
复制代码
4. 打开页面时, 自适应屏幕:
WebSettings webSettings = mWebView .getSettings();
webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
webSettings.setLoadWithOverviewMode(true);
5. 便页面支持缩放:
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>