这几天项目中用到类似于QQ做的聊天内容中提取电话号码和URL的功能。总结一下,点点滴滴都是进步。

还是首先看大致效果图:

就是要识别出聊天中的网址,电话或者Email之类的。

1如果项目要求比较简单的话,TextView本身就在这样一个属性 android:autoLink=”web|phone”,只要我们添加了这样的属性,便会自动识别textview中的内容,并且执行相应的操作,点击网址链接,点击电话调用系统的拨号等等。可以根据需求添加相应的识别类型。

2但是,有时候需求还是比较麻烦的,比如说QQ中点击聊天中的电话号码,是弹出的一个dialog,而不是调用系统的打电话。因此,很多事都得我们自己做了。思路:通过正则表达式提取出电话号码—>spannablestring添加下划线—>给电话设置点击事件——>dialog弹窗,然后执行相应的操作

还是先看效果图(本文中的dialgo主要借鉴于http://www.javaapk.com/source/6994.html)

主要知识还是在代码注释展示;

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主要是对字符串的处理,可以对字符串中的某些字符加入颜色,背景,下划线等之类的效果;    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);        // textview.setText(text);        checkPhoneText(sp, text);        //对字符串设置点击事件,如果在字符串中找到是Spannable中的内容,则把点击事件给sp,否则给原来的字符串        //比如说QQ中,我们点击电话号码可以打电话,但是点击整个item的时候还弹出一个popwindow,如果不区分的话,        //是不响应点击事件的;        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();                //根据点击判断是否在spannable对象上;                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;        }        //点击链接下划线,弹出dialog,提示提电话,或者发短信;        @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();                                    // 系统默认的action,用来打开默认的短信界面                                    intent.setAction(Intent.ACTION_SENDTO);                                    // 需要发短息的号码                                    intent.setData(Uri.parse("smsto:" + mUrl));                                    startActivity(intent);                                }                            }).show();        }    }}

Demo下载地址:http://download.csdn.net/download/androidxiaogang/9120375

更多相关文章

  1. Android中TextView实现分段显示不同颜色的字符串
  2. Android(安卓)无入侵解决按钮重复点击---onClick处理
  3. Android开发实践(六)字符串实现DES加密
  4. 第14天 Android(安卓)Touch事件学习 1 点击事件
  5. Android应用开发学习记录(一)ImageView 添加点击效果
  6. Google 给 7.1+ 加了段代码,让你觉得更安全了吗?
  7. Android应用程序打包时,出现错误:"XXX" is not translated in "af
  8. 微信检查被删好友(Android(安卓)Accessibility 学习实践 )
  9. 如何打开USB调试模式(Android(安卓)所有版本对应的打开方法)

随机推荐

  1. Android(安卓)setLayerType 硬件加速问题
  2. Android和IOS开发资料
  3. Android(安卓)内核源代码交叉编译纺
  4. android的零星基础点(多媒体)之一
  5. android sd卡数据库读取
  6. 给动态生成的View添加水波纹效果
  7. 禁止Activity+ EditText 界面默认弹出键
  8. 部分可点击的TextVie
  9. android dialog home键
  10. 64位 Ubuntu android studio 编译android