EditText要实现每次删除固定位置的@的昵称,其实就是要在字符串中查找到每个昵称的开始和结束位置。这边用正则表达式匹配的每个昵称的位置。具体代码如下
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
EditText editText = (EditText) view;
Editable editable = editText.getText();
//获取光标所在位置
int selectionStart = editText.getSelectionStart();
String content = editable.toString().substring(0, selectionStart);
Pattern pattern = Pattern.compile(".*@.+\\s");
Matcher matcher = pattern.matcher(content);
//查询字符串中是否有以@开头和空格结尾的格式
if (matcher.find() && event.getAction() == KeyEvent.ACTION_DOWN) {
if (TextUtils.equals(matcher.group(), content) && keyCode == KeyEvent.KEYCODE_DEL) {
ArrayList<Integer> indexs = new ArrayList<>();
Pattern patternSub = Pattern.compile("@.+?\\s");
Matcher matcherSub = patternSub.matcher(content);
while (matcherSub.find()) {
indexs.add(matcherSub.start());
}
if (indexs.size() > 0) {
//删除距离光标最近的符合筛选逻辑的字符串
editable.delete(indexs.get(indexs.size() - 1),content.length());
return true;
}
}
}
return false;
}
});
~~~