前段时间做的项目涉及到WebView与js交互,当是有些困惑,不过还是解决了:
一、WebView 基本用法
1.首先不要忘记在清单文件下添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2.在布局中添加WebView
只需使用标签
<WebView android:id="@+id/mWebView" android:layout_width="match_parent" android:layout_height="400dp" />
3.在代码中使用
WebView mWebView = (WebView) findViewById(R.id.mWebView);
mWebView.loadUrl("http://www.baidu.com");
二、WebView与js交互
1.我们需要使用一个类 WebSettings
在代码中构建:WebSettings settings = mWebView.getSettings();
2.与js交互就要设置 支持相关属性,以下是一些常用的设置:
settings.setJavaScriptEnabled(true);//设置支持js
settings.setJavaScriptCanOpenWindowsAutomatically(true);//设置js能直接打开窗口
settings.setDefaultTextEncodingName("utf-8");//设置编码格式
settings.setBuiltInZoomControls(true);//设置支持缩放
settings.setUseWideViewPort(true);//适配屏幕,可以任意比例缩放 settings.setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解决网页自适应问题
settings.setAppCacheEnabled(true);//设置使用缓存
3.与js进行交互要定义一个类似于协议的东西:例如我们定义为:forAndroid
3.1我们需要写一个用于提供js调用Android方法的类,暂命名:JavaScriptObject
public class JavaScriptObject {
//写了一个方法让js调用
//在高版本中要添加引用js
@JavascriptInterface
public void FromAndroid(String string) {
//处理相关逻辑代码... }
}
//设置本地调用对象及其接口,填写定义的协议:forAndroid
mWebView.addJavascriptInterface(new JavaScriptObject(MainActivity.this),"forAndroid");
//载入网页:
mWebView.loadUrl(UrlPath.main_web);
3.2 js已经调用了Android的方法,下面是Android 调用js
例如Html页面中的js方法为:positionPoint(string) 参数为一个字符串,传参的时候需要注意添加引号,调用如下:
mWebView.loadUrl("javascript:positionPoint('"+ "我是一个字符串"+"')");
前方高能---》开发过程中存在Android 调用不到js的问题,原因是js在运行之前需要有一个documen的对象,所以我们在加载的时候需要load一 个空白页。如果loda空白页的时候没有执行完Html,里面的方法就不走。所以如果想在原生中调用js的方法,让js的document对象 生成有一下几种方法:
1.使用按钮点击调用js
2.使用延时调用
3.在页面加载完调用
按照需求和实际开发情况选取:个人一般会使用第三种方式:
mWebView.setWebViewClient(new MyWewViewClient());
//创建一个类继承 WebViewClient,重写onPageFinished()方法
class MyWewViewClient extends WebViewClient{
@Override
public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); main_webview.loadUrl("javascript:positionPoint('"+ "我是一个字符串"+"')"); }
}
这样的话在Html加载完成后调用js就行了
三、其他用法:
1有时候WebView加载Html时,需要跳转网页,默认是使用手机浏览器打开,我们需要跳转依然在当前WebView
mWebView
.setWebViewClient(
new
WebViewClient(){ @Override
public
boolean
shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url);
return
true
; } });
2.按下返回键是,不是退出程序,而是返回上一级页面
public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); }
3.最后再添加一个网页加载过程
mWebView.setWebChromeClient(new WebChromeClient(){
public void onProgressChange(WebView view,int newProgress){
super.onProgressChanged(view,newProgress);
if(newProgress==100){
Log.i("tag","网页加载完成了");
}else{
Log.i("tag","网页加载中...");
}
}
});
好了,关于WebView的知识就介绍到这了。