Android中仿QQ聊天内容中提取电话号码,URL
16lz
2021-01-26
这几天项目中用到类似于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
更多相关文章
- Android中TextView实现分段显示不同颜色的字符串
- Android(安卓)无入侵解决按钮重复点击---onClick处理
- Android开发实践(六)字符串实现DES加密
- 第14天 Android(安卓)Touch事件学习 1 点击事件
- Android应用开发学习记录(一)ImageView 添加点击效果
- Google 给 7.1+ 加了段代码,让你觉得更安全了吗?
- Android应用程序打包时,出现错误:"XXX" is not translated in "af
- 微信检查被删好友(Android(安卓)Accessibility 学习实践 )
- 如何打开USB调试模式(Android(安卓)所有版本对应的打开方法)