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_一步步学习Android

此时,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_debug_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);
    }
}