文章目录
准备工作
创建一个名为WebViewActivity的Activity,布局中放一个WebView控件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WebViewActivity">
<WebView
android:id="@+id/WebView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayou
1.加载URL
加载assets下的html文件
webView.loadUrl("file:///android_asset/test.html");
在main目录下新建一个assets Folder
创建一个简单的html文件用于测试,将其名字命名为test,放入assets目录下
<html>
Hello World!
</html>
直接使用loadUrl方法加载
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.WebView);
// 加载本地html
webView.loadUrl("file:///android_asset/test.html");
}
}
加载网络URL
webview.loadUrl("http://m.baidu.com");
由于百度的首页需要js的支持,但是java默认是不支持js的,所以需要设置支持js
webView.getSettings().setJavaScriptEnabled(true);
完整代码
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.WebView);
// 加载网络url
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://m.baidu.com");
}
}
当在百度首页点击进入其他界面时会弹出一个对话框询问用户需不需要用本地的其他浏览器打开,可以设置继续使用当前的webview打开
webView.setWebViewClient(new MyWebViewClient());
这里需要传入一个WebVIewClient,我们可以写一个内部类继承WebVIewClient
class MyWebViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//不用外部浏览器,直接在当前webview加载网页
view.loadUrl(request.getUrl().toString());
}
return true;
}
}
在onCreate方法里加入
webView.setWebViewClient(new MyWebViewClient());
这样就OK啦。
网页开关添加伴随操作
在MyWebViewClient 中重写WebVIewClient的onPageStarted和onPageFinished方法,在网页加载和加载完成时执行,这里只是简单的打印一条日志
class MyWebViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
view.loadUrl(request.getUrl().toString());
}
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("WebView","onPageStarted...");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("WebView","onPageFinished...");
}
}
重定义按下返回键的作用
默认情况下按下返回键是退出应用,为了实现按下返回键后退的功能,可以重写WebViewActivity的onKeyDown方法:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
设置WebChromeClient
写一个内部类MyChromeClient 继承WebChromeClient
class MyChromeClient 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);
//设置webview的标题为网页标题
setTitle(title);
}
}
在onCreate方法中添加语句
webView.setWebChromeClient(new MyChromeClient());
就可以了
还有一个进入网页弹出提示对话框的js写法,这里是在MyWebViewClient 的onPageStarted中写的
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("WebView","onPageStarted...");
//进入网页弹出提示对话框的js写法
//第一种
// webView.loadUrl("javascript:alert('hello')");
//第二种
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// webView.evaluateJavascript("javascript:alert('hello')",null);
// }
}
加载html代码
webview.loadData();
webview.loadDataWithBaseURL();
第二个方法稳定性更好,不容易乱码。
2.网页的前进后退的相关方法
作用就像这些英语的意思一样:
webview.canGoBack();
webview.goBack();
webview.canGoForward();
webview.goForward();
webview.GoBackOrForward(int steps);//正数代表向前,负数代表向后
webview.goBackOrForward(int steps);