我的环境:win7 ,Android studio 3.0.1. java8;
webView.loadUrl("file:android_asset/text");
<a href="file:///android_asset/text2">点击</a></head>
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView.canGoBack()) {
webView.goBack();
} else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}
1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同: //例如:加载assets文件夹下的test.html页面
webView.loadUrl("file:android_asset/text");
:加载网页
mWebView.loadUrl("http://www.baidu.com")
如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebView.loadUrl(url);
return true;
}
}
2、Android本地通过Java调用HTML页面中的JavaScript方法 想要调用js方法那么就必须让webView支持 WebSettings webSettings = mWebView.getSettings(); //设置为可调用js方法 webSettings.setJavaScriptEnabled(true); 若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
webView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
tv.setText("sum= "+value);
}
});
}
});
js代码如下:
<script type="text/javascript">
function sum(a,b){
return a+b;
}
</script>
2、js调用Android本地Java方法 在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法
package com.itep.myapplication;
import android.webkit.JavascriptInterface;
/**
* Created by Administrator on 2020/4/10 0010.
*/
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}
定义完这个方法后再调用mWebView.addJavascriptInterface()方法:
webView.addJavascriptInterface(new JsInteration(), "android_ceshi");
那么在js中怎么来调用呢?
<!DOCTYPE html>
<html>
<head>
<title></title>
<h1>text 2</h1>
<button onclick="s()">dianji</button>
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function s(){
var result =window.android_ceshi.back();
document.getElementById("p").innerHTML=result;
}
function ceshi(){
var ss="123";
document.write(ss);
}
</script>
</head>
<body>
<button onclick="s()">调用本地方法</button>
<a href="file:///android_asset/test2">点击</a>
<p id="p"></p>
</body>
</html>
4、拦截HTML页面中的点击事件
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断url拦截事件
if (url.equals("file:///android_asset/text2")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,MainActivity_two.class));
return true;
} else {
webView.loadUrl(url);
return false;
}
}
});
tex.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<p>你好你好script type你好script type你好script type你好script type</p>
<button onclick="ceshi()">dianji</button>
<button onclick="ceshi()">dianji</button>
<button onclick="ceshi()">dianji</button>
<button onclick="ceshi()">dianji</button>
<button onclick="ceshi()">dianji</button>
<button onclick="ceshi()">dianji</button>
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function s(){
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
function ceshi(){
var ss="123";
document.write(ss);
}
</script>
<a href="file:///android_asset/text2">点击</a></head>
<body>
<button onclick="s()">调用本地方法</button>
<p id="p">ceshi</p>
</body>
</html>
text2.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<h1>text 2</h1>
<button onclick="s()">dianji</button>
<script type="text/javascript">
function sum(a,b){
return a+b;
}
function s(){
var result =window.android.back();
document.getElementById("p").innerHTML=result;
}
function ceshi(){
var ss="123";
document.write(ss);
}
</script>
</head>
<body>
<button onclick="s()">调用本地方法</button>
<a href="file:///android_asset/test2">点击</a>
<p id="p"></p>
</body>
</html>
MainActivity.class
package com.itep.myapplication;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
WebView webView;
TextView tv;
/**
* @param savedInstanceState
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.wb);
WebSettings webSettings = webView.getSettings();
//设置为可调用js方法
webSettings.setJavaScriptEnabled(true);
webView.getSettings().setDefaultTextEncodingName("utf-8");
// webView.loadUrl("file:android_asset/text.html");
webView.loadUrl("file:android_asset/text");
// Example of a call to a native method
tv = (TextView) findViewById(R.id.sample_text);
webView.addJavascriptInterface(new JsInteration(), "android");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断url拦截事件
if (url.equals("file:///android_asset/text2")) {
Log.e(TAG, "shouldOverrideUrlLoading: " + url);
startActivity(new Intent(MainActivity.this,MainActivity_two.class));
return true;
} else {
webView.loadUrl(url);
return false;
}
}
});
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
// tv.setText(new Text().stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
JsInteration:
package com.itep.myapplication;
import android.webkit.JavascriptInterface;
/**
* Created by Administrator on 2020/4/10 0010.
*/
public class JsInteration {
@JavascriptInterface
public String back() {
return "hello world";
}
}