Android中仿QQ聊天内容中提取电话号码,URL

这几天项目中用到类似于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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值