直接上代码:
MainActivity中代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
final WebView webView = (WebView) findViewById(R.id.web1);
webView.loadUrl("http://192.168.1.108:8081/");
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JiaoHu(),"hello");
Button btn = (Button) findViewById(R.id.click);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.loadUrl("javascript:android(true)");
}
});
}
public class JiaoHu{
@JavascriptInterface
public void showAndroid(){
Toast.makeText(MainActivity.this,"js调用了android的方法",Toast.LENGTH_SHORT).show();
}
}
}
activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/click"
android:text="点我"
android:layout_marginTop="50dp"/>
<WebView
android:id="@+id/web1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="89dp">
</WebView>
</android.support.constraint.ConstraintLayout>
html中的代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>
<p id="ap">快递顺丰快递是</p>
<button onclick="window.hello.showAndroid()">的说法是</button>
<button onclick="self()" id="btn">大师傅但是</button>
</div>
<script type="text/javascript">
function android(bl){
if(bl){
document.getElementById("ap").innerHTML= "大师傅似的"
}else{
document.getElementById("ap").innerHTML= "的身份"
}
}
function self(){
document.getElementById("btn").innerHTML= "dsfdss"
}
</script>
</body>
</html>
webview.addJavascriptInterface(mSnMap, "android");
添加了一个java和js交互的接口,android字符串相当于一个Brige桥梁的作用,安卓4.2以后增加了@JavascriptInterface接口,
只有代码@JavascriptInterface注解的方法js才能调用,之前是被注入的类和从父类继承的所有的public的方法都能访问,这也是进一步保证APP的安全性.
setWebChromeClient比setWebViewClient功能强大一些,
-
setWebClient帮助WebView处理各种通知、请求事件
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
如果你不需要太多的功能而仅仅是渲染一个HTML网页,只需要用setWebViewClient就可以了,但是如果要处理比较复杂的事务,就考虑用后者
2.setWebChromeClient辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问。
WebViewClient会在一些影响内容喧嚷的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到http认证需要处理、页面键盘响应、页面中的url打开处理等等