最近项目有个需求:用户可能在应用内任何地方输入一个网址,这个网址带有固定标识参数来告知是一个小游戏或者其它,需要这个网址跳往app内部的webview,同时和JS有数据交互。由于之前对于应用内webview展示的地方是加载html片段,所以用户输入的链接地址没有做处理,尤其是textview没有加超链接和webview直接输入网址没有加A标签,导致都是纯文本而不能点击,所以项目要解决问题有以下:
1.webview的文本内容通过正则来匹配出所有网址,并手动加上A标签,这样就可点击了。同时拦截点击跳往应用内部的webview页面。
2.textview加入超链接,同时拦截跳转到应用内部webview页面。
3.webview JS交互
首先用正则匹配出文本内的所有网址并且加上A标签
public static ArrayList<String> getCompleteUrl(String text) {
ArrayList<String> urls = new ArrayList<String>();
Pattern p = Pattern.compile("((http|ftp|https)://)(([a-zA-Z0-9\\._-]+\\.[a-zA-Z]{2,6})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\\&%_\\./-~-]*)?", Pattern.CASE_INSENSITIVE);
Matcher matcher = p.matcher(text);
while (matcher.find()){
String url = matcher.group();
if (url.contains("drawgame=1")){//只给游戏加
urls.add(url);
}
}
return urls;
}
加上A标签这样就可以点击了
for (int i = 0; i < urlList.size(); i++) {//把链接地址加上A标签
String reString = "<a href=\""+urlList.get(i)+"\">"+urlList.get(i)+"</a>";
content = content.replace(urlList.get(i),reString);
}
然后是Textview加超链接并且拦截点击事件
public static void interceptHyperLink(Context mContext,TextView tv) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
CharSequence text = tv.getText();
if (text instanceof Spannable) {
int end = text.length();
Spannable spannable = (Spannable) tv.getText();
URLSpan[] urlSpans = spannable.getSpans(0, end, URLSpan.class);
if (urlSpans.length == 0) {
return;
}
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
// 循环遍历并拦截 所有http://开头的链接
for (URLSpan uri : urlSpans) {
String url = uri.getURL();
if (url.indexOf("http://") == 0) {
CustomUrlSpan customUrlSpan = new CustomUrlSpan(mContext,url);
spannableStringBuilder.setSpan(customUrlSpan, spannable.getSpanStart(uri),
spannable.getSpanEnd(uri), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
tv.setText(spannableStringBuilder);
}
}
public class CustomUrlSpan extends ClickableSpan {
private Context context;
private String url;
public CustomUrlSpan(Context context,String url){
this.context = context;
this.url = url;
}
@Override
public void onClick(View widget) {
//自定义点击事件
}
}
自定义UriSpan
然后是JS交互
// 定制和web交互
public class HandleJSCallback {
public HandleJSCallback() {
}
@JavascriptInterface
public void choseLocalImg() {
choseImg(false);
}
@JavascriptInterface
public void getLocation() {
startTencentLocation();
}
@JavascriptInterface
public void openQrcode() {//扫描二维码
scanQRcode();
}
@JavascriptInterface
public void uploadImage(String jsonParams){//指定的裁剪
doImageNext(jsonParams);
}
@JavascriptInterface
public void finishPager() {//关闭页面
SuperCreateHtmlSeePager.this.finish();
}
@JavascriptInterface
public void addUserScore(int score){//操作分数
Message msg = new Message();
msg.what = 1;
msg.arg1 = score;
mHandler.sendMessage(msg);
}
}
mWebview.addJavascriptInterface(new HandleJSCallback(), "android");
以下为webview拦截链接点击
mWebView.setWebViewClient(new MyWebViewClient(mContext));
private Context mContext;
public MyWebViewClient(Context context){
mContext = context;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null) {//自定义跳转
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageFinished(view, url);
}
网友评论