大佬全面讲解
准备工作: 在布局中添加WebView ;在类中绑定WebView;
WebView加载页面:
webView.loadUrl("https://www.baidu.com/");//加载百度
判断webview是否加载完成:
webview.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView view, int progress)
{
if(progress == 100){
//progress到一百后就是加载完成,在里边写你要调用的方法就行了
}
}
}
如果不想跳转浏览器加载网页: 就加上以下代码,想跳转就不设置以下代码
//如果不设置WebViewClient,请求会跳转系统浏览器
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//该方法在Build.VERSION_CODES.LOLLIPOP以前有效,从Build.VERSION_CODES.LOLLIPOP起,建议使用shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead
//返回false,意味着请求过程里,不管有多少次的跳转请求(即新的请求地址),均交给webView自己处理,这也是此方法的默认处理
//返回true,说明你自己想根据url,做新的跳转,比如在判断url符合条件的情况下,我想让webView加载http://ask.csdn.net/questions/178242
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
{
//返回false,意味着请求过程里,不管有多少次的跳转请求(即新的请求地址),均交给webView自己处理,这也是此方法的默认处理
//返回true,说明你自己想根据url,做新的跳转,比如在判断url符合条件的情况下,我想让webView加载http://ask.csdn.net/questions/178242
return false;
}
});
WebView基本设置(更多设置请自行搜索):
WebSettings webSettings = webView.getSettings();//获得websetting
webSettings.setJavaScriptEnabled(true);//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
webSettings.setCacheMode(WebSettings. LOAD_DEFAULT);//默认加载方式
webSettings.setAllowFileAccess(true); //设置可以访问文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
WebSettings.CacheMode总够有5个选项
- LOAD_DEFAULT: * 默认加载方式,使用这种方式,会实现快速前进后退,在同一个标签打开几个网页后,关闭网络时,可以通过前进后退来切换已经访问过的数据,同时新建网页需要网络
- LOAD_NO_CACHE
- LOAD_NORMAL
- 这个方式跟LOAD_NO_CACHE方式相同,不使用缓存,如果没有网络,即使以前打开过此网页也不会使用以前的网页。
- LOAD_CACHE_ELSE_NETWORK
- 这个方式不论如何都会从缓存中加载,除非缓存中的网页过期,出现的问题就是打开动态网页时,不能时时更新,会出现上次打开过的状态,除非清除缓存。
- LOAD_CACHE_ONLY
- 这个方式只是会使用缓存中的数据,不会使用网络。
影响缓存模式的两个http头是If-None-Match和If-Modified-Since,遇到这两个http头,浏览器会把缓存模式改为LOAD_NO_CACHE方式。
- 这个方式只是会使用缓存中的数据,不会使用网络。
JS调用android:
//js调用android
webView.addJavascriptInterface(new JsJavaBridge(), "android");// 一参:js调用的android的方法的存放类 二参:js调用android的方法的引用名
/**
* js调用android的方法的存放类
*/
class JsJavaBridge {
//没有返回值
@JavascriptInterface //必须加上不然js无法调用
public void onFinishActivity() {
finish();
}
// 有 返回值和参数
@JavascriptInterface
public String muserName(String data) {
//需要把data转为jsonobject(js不能直接传对象过来)
return userName;
}
}
js调用代码:
//接收调用方法的返回值和参数
str=android.muserName(data);
//调用方法无返回值
android.onFinishActivity();
@JavascriptInterface 必须加上不然js无法调用
android调用js:
//带参数
webView.post(new Runnable() {
@Override
public void run() {
String fileName=file.getName();
long fileSize=file.length();
webView.loadUrl("javascript: getFilePath('"+filePath+"','"+fileName+"','"+fileSize+"')"); // getFilePath()是js的被调用方法名
}
});
//不带参数
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript: getFilePath()"); // getFilePath()是js的被调用方法名
}
});
js方法代码:
window['getFilePath']=(filePath,fileName,fileSize)=>{
js自己的逻辑
};