WebView是android中一个非常重要的控件,它的作用是用来展示一个web页面。它使用的内核是webkit引擎,4.4版本之后,直接使用Chrome作为内置网页浏览器。
两点需要注意:
1.这是最基本的 AndroidManifest.xml 中必须添加访问网络权限。
2.如果访问的页面中有 Javascript,则 WebView 必须设置支持 Javascript。
使用介绍
-
载入页面
有4种方法:
1.在本地新建assets文件夹,把html文件放里面,访问方式: webView.loadUrl(“file:///android_asset/demo01.html”);
2.把网页url直接作为参数:
webView.loadUrl(“https://m.bing.com”);
3. 也可以直接把html代码作为参数传入
webView.loadData();
webView.loadDataWithBaseUrl();这两个相比,上面一个有可能出现乱码,下面这个乱码的几率相对低一些
-
onKeyDown() 重写返回键的作用:
如果需要实现返回键回退上一页的功能就需要重写这个方法,因为默认是退出当前activity。 -
设置支持js代码读取
webView.getSettings().setJavaScriptEnabled(true); -
webView.setWebViewClient(new MyWebViewClient());
这里需要写一个内部类继承自WebViewClient,里面有几个方法:- shouldOverrideUrlLoading:显示页面加载的进度条
- onPageStarted:定义页面开始的时候做些什么
- onPageFinished: 定义页面关闭的时候做些什么
-
webView.setWebChromeClient(new MyWebChromeClient());
参数也需要自定义继承自WebChromeClient,里面的方法:
1.onProgressChanged():进程改变时做些什么
2.onReceivedTitle():参数里有正在访问页面的标题,可以把它设置到app的标题上,(app标题默认是项目的名字)
网页的前进后退
- boolean webview.canGoBack():判断能否返回上一层
- webview.goBack();返回
- webview.canGoForward()
- webview.goForward()
- webview.canGoBackOrForward(int steps);能否前进或后退多少步,参数是int,正数表示前进,负数表示后退
- webview.goBackOrForward(int steps);前进steps步。正数前进,负数后退
案例
package com.example.test.webview;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.example.test.R;
public class WebViewActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = findViewById(R.id.wv);
//加载本地assets文件夹下的html。
//webView.loadUrl("file:///android_asset/demo01.html");
webView.setWebViewClient(new MyWebViewClient());
//加载网络url。手机站点一般是m开头而不是www。下面这句话是设置js正常运行的。不写是不能运行自己写的js代码的
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new MyWebChromeClient());
webView.loadUrl("https://m.bing.com");
}
private class MyWebViewClient extends WebViewClient {
@Override
//显示网页加载的进度条
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//防止在界面打开网址时提示使用手机浏览器打开。
view.loadUrl(request.getUrl().toString());
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
webView.loadUrl("javascript:alert('onPageStarted()')");
Log.d("webview","onPageStart________________________________________");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//载入自己写的js代码
webView.loadUrl("javascript:alert('onPageFinished()')");
Log.d("webview","onPageFinished________________________________________");
}
}
@Override
//重写这个方法,改变返回键的操作,改成退回上一页面。返回键默认退出当前activity
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
//return true一定不要忘了,不然这段代码完了还会触发默认的监听器,会退出这个页面而不是返回上一页
return true;
}
return super.onKeyDown(keyCode, event);
}
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
@Override
//将所打开网页的标题设置到app的标题上
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
setTitle(title);
}
}
}