Android(安卓)写输入编辑框增加@功能,@相关字符高亮
16lz
2021-01-24
先说明需求,是在输入编辑框EditText中实现输入@字符后其后输入的中文和数字都会高亮,其他字符出现时,自动截断高亮部分。
思路:使用TextWatcher实现监听,对于监听到的文本,使用正则表达式,匹配出符合条件的文本,然后使用SpannableString对其实现高亮。
private TextWatcher textWatcher = new TextWatcher() { int l = 0;//记录字符串被删除字符之前,字符串的长度 int location = 0; @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { l = s.length(); location=mEditContent.getSelectionStart(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (l != s.toString().length()) { String input = s.toString(); SpannableString msp = new SpannableString(input); Pattern pattern = Pattern.compile("\\@([a-zA-Z0-9\\u4e00-\\u9fa5]+)"); Matcher matcher = pattern.matcher(input); while (matcher.find()) { int start = matcher.start(); int end = matcher.end(); msp.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.attext_blue)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } mEditContent.setText(msp); Editable etable = mEditContent.getText(); Selection.setSelection(etable, location); } } };
就这么简单,有一个问题,在正则匹配出符合条件的字符后,需要使用SpannableString对其进行颜色设置,然后edittext.setText(span),这里如果不做处理,容易出现死循环。所以在public void beforeTextChanged(CharSequence s, int start, int count, int after)
方法里先获取字符串改变之前的长度,然后与输入后的字符串长度做比较。这样就会防止死循环。
更多相关文章
- 让你的Android开发效率提高10倍的开源工具库AndroidTools的使用
- Android资源String中html标签的使用
- Android(安卓)NDK开发技巧二
- Android(安卓)访问Android(安卓)Wear数据层Api——同步Data Item
- Android开发系列之调用WebService
- Android第十九课 attempt to write a readonly database解决
- Android基础教程(八)之仿百度谷歌搜索自动提示框-----AutoComple
- Android(安卓)EditText限制输入字符的5种实现方式
- android 集合与json之间的相互转换