WebView恐怕是每个Android工程师用得最多的控件之一,它可以加载多种形式的网络页面。这无疑也是Android的核心功能之一。

一个最简单的WebView使用代码如下,

layout/activity_web_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<WebView
android:id="@+id/wv_main1"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>


</LinearLayout>

WebViewActivity

package com.spacesoftwares.myapplication3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class WebViewActivity extends AppCompatActivity {

private WebView mWvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWvMain = findViewById(R.id.wv_main1);
mWvMain.loadUrl("file:android_asset/test.html");
}
}

要注意的问题1

这里要特别注意的是,通常文件夹是通过下面的方式添加的,

Android之WebView_ide

此时,Android Studio会自动配置build.gradle(module app),添加相应的代码,如下,

(我的文件夹路径:D:\AndroidStudioProjects\MyApplication3\app\src\main\assets)

apply plugin: 'com.android.application'

android {
。。。。。。
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}

如果你是通过手动建议的文件夹,请务必将相应的位置信息在gradle中设置好。

要注意的问题2

不知从什么时候起,Android Studio的Url需要四个“/”,你可能已经注意到mWvMain.loadUrl("file:android_asset/test.html");这里file:使用了4个反斜杠。否则的话,你可能会得到ERR_FILE_NOT_FOUND这样的警告,

Android之WebView_android_02

最后,给个最终的显示结果吧,我的HTML代码如下,

<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<p>
This is a section of test message!!
</p>
</body>
</html>

显示如下

Android之WebView_webview_03

当然WebView还有不少支持功能,比如setWebViewClient,他主要处理各种通知、请求事件;setWebChromeClient则主要负责处理JavaScript的对话框,网站图标,网站title,加载进度等。

下面这个详实的例子,演示了如何使用这些功能

package com.spacesoftwares.myapplication3;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebViewActivity extends AppCompatActivity {

private WebView mWvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWvMain = findViewById(R.id.wv_main1);
mWvMain.getSettings().setJavaScriptEnabled(true);
mWvMain.setWebViewClient(new MyWebViewClient());
mWvMain.setWebChromeClient(new MyWebChromeClient());
mWvMain.loadUrl("https://m.baidu.com");
}

class MyWebViewClient extends WebViewClient {

public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mWvMain.evaluateJavascript("javascript:alert('Info: Page loaded')", null);
}
}

class MyWebChromeClient extends WebChromeClient {

@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}

@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
setTitle(title);
}
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==event.KEYCODE_BACK && mWvMain.canGoBack()){
mWvMain.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}