这几天项目中用到类似于QQ做的聊天内容中提取电话号码和URL的功能。总结一下,点点滴滴都是进步。
还是首先看大致效果图:
![这里写图片描述](https://img-blog.csdn.net/20150918231922381)
就是要识别出聊天中的网址,电话或者Email之类的。
1如果项目要求比较简单的话,TextView本身就在这样一个属性 android:autoLink=”web|phone”,只要我们添加了这样的属性,便会自动识别textview中的内容,并且执行相应的操作,点击网址链接,点击电话调用系统的拨号等等。可以根据需求添加相应的识别类型。
2但是,有时候需求还是比较麻烦的,比如说QQ中点击聊天中的电话号码,是弹出的一个dialog,而不是调用系统的打电话。因此,很多事都得我们自己做了。思路:通过正则表达式提取出电话号码—>spannablestring添加下划线—>给电话设置点击事件——>dialog弹窗,然后执行相应的操作
![这里写图片描述](https://img-blog.csdn.net/20150919172941467)
主要知识还是在代码注释展示;
package com.example.autolinedemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import view.ActionSheetDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ClickableSpan;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
String text = "这有一个好玩的网址http://www.baidu.com,我的电话"
+ "号码是13146921506,我的固定电话是010-12345678,3000,100,"
+ "5块还有一个电话号码0371-1234567," + "037-1234567(这个应该识别不出来,根据正则识别)";
private TextView textview;
SpannableString sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp = new SpannableString(text);
textview = (TextView) findViewById(R.id.textview);
checkPhoneText(sp, text);
textview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean ret = false;
CharSequence text = ((TextView) v).getText();
Spannable stext = Spannable.Factory.getInstance().newSpannable(
text);
TextView widget = (TextView) v;
int action = event.getAction();
if (action == MotionEvent.ACTION_UP
|| action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = stext.getSpans(off, off,
ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
}
ret = true;
}
}
return ret;
}
});
}
private void checkPhoneText(SpannableString sp, String text) {
Pattern pattern = Pattern
.compile("\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}");
Matcher matcher = pattern.matcher(text);
int start = 0;
while (matcher.find(start)) {
start = matcher.end();
sp.setSpan(new MyUrlSpan(matcher.group()), matcher.start(),
matcher.end(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
if (start >= text.length()) {
break;
}
}
textview.setText(sp);
}
class MyUrlSpan extends ClickableSpan {
private String mUrl;
MyUrlSpan(String url) {
mUrl = url;
}
@Override
public void onClick(View widget) {
new ActionSheetDialog(MainActivity.this)
.builder()
.setCancelable(true)
.setCanceledOnTouchOutside(true)
.addSheetItem("打电话", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
Intent intent = new Intent(
Intent.ACTION_CALL, Uri
.parse("tel:" + mUrl));
startActivity(intent);
}
})
.addSheetItem("发短信", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("smsto:" + mUrl));
startActivity(intent);
}
}).show();
}
}
}