上一节说到可以使用<a/>超链接标签来定义相应的协议,当用户点击了此标签之后,客户端能拦截到此事件,然后进行拦截并作出相应的处理: 方法是自定义一个WebViewClient,然后给webView设置WebViewClient,这样在点击超链接的时候就能拿到相应的回调。 第一节的地址为 Android WebView探索 一、Naive与WebView的互相调用
因为我们可以拦截到整个超链接标签的uri,所以,我们根据以下三个步骤来进行自定义拦截:
2、判断其path,根据path来决定需要执行的动作
3、得到uri中的参数值
下面为代码:
private class Client extends WebViewClient {
private static final String PROTOCOL_CUSTOM = "heng";
private static final String PATH_TOAST = "/toast";
/**
* 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
*
* @param view
* @param urlString WebView访问的新的String
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlString) {
Uri uri = Uri.parse(urlString);
String scheme = uri.getScheme();
//当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
if (scheme.equals(PROTOCOL_CUSTOM)) {
String path = uri.getPath();
//得到对应的path,可以根据path知道web想要做出的动作是什么
if (path.equals(PATH_TOAST)){
//知道需要作出的动作后,得到参数值,执行相应的动作
String parameter = uri.getQueryParameter("arg");
Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
}
Log.d("Main","拦截成功");
return true;
}
return false;
}
}
使用此WebViewClient的代码为;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.main_wv);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(this, "naive");
//为WebView设置相应的回调
mWebView.setWebViewClient(new Client());
mWebView.loadUrl("file:///android_asset/demo.html");
}
待拦截的HTML的代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
<a href="heng://0.0.0.0/toast?arg=hello web">链接</a>
</body>
</html>
下面为整个MainActivity的源码:
public class MainActivity extends Activity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.main_wv);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(this, "naive");
//为WebView设置相应的回调
mWebView.setWebViewClient(new Client());
mWebView.loadUrl("file:///android_asset/demo.html");
}
private class Client extends WebViewClient {
private static final String PROTOCOL_CUSTOM = "heng";
private static final String PATH_TOAST = "/toast";
/**
* 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
*
* @param view
* @param urlString WebView访问的新的String
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlString) {
Uri uri = Uri.parse(urlString);
String scheme = uri.getScheme();
//当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
if (scheme.equals(PROTOCOL_CUSTOM)) {
String path = uri.getPath();
//得到对应的path,可以根据path知道web想要做出的动作是什么
if (path.equals(PATH_TOAST)){
//知道需要作出的动作后,得到参数值,执行相应的动作
String parameter = uri.getQueryParameter("arg");
Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
}
Log.d("Main","拦截成功");
return true;
}
return false;
}
}
}