简单的自定义edittext,实现一键清除,限制emoji表情

来源:互联网 发布:两个字符串相似度算法 编辑:程序博客网 时间:2024/06/06 07:42

首先创建一个类继承editText实现其构造方法

public MyEditText(Context context) {    this(context,null);}public MyEditText(Context context, AttributeSet attrs) {    super(context, attrs);    this.mContext=context;    init(context);}
在init里做一些准备,设置监听这些监听一个是滑动的监听一个是获取焦点的监听
private void init(Context context) {    drawable = context.getResources().getDrawable(R.mipmap.ic_edit_delete);//调用系统资源获取删除的图标    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());//绘制在哪个区域    setClearIconVisible(false);    super.setOnTouchListener(this);    super.setOnFocusChangeListener(this);    addTextChangedListener(this);//该方法必须写}
//设置图标什么时候出现
private void setClearIconVisible(boolean visible) {    drawable.setVisible(visible, false);    Drawable[] drawables=getCompoundDrawables();    setCompoundDrawables(drawables[0], drawables[1], visible?drawable:null, drawables[3]);}
/****************************以下是禁止输入表情的代码**************************************/
@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {    if (!resetText) {        cursorPos = getSelectionEnd();        // 这里用s.toString()而不直接用s是因为如果用s,        // 那么,inputAfterText和s在内存中指向的是同一个地址,s改变了,        // inputAfterText也就改变了,那么表情过滤就失败了        inputAfterText = s.toString();    }}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {    if (isFocused()) {        setClearIconVisible(getText().length()>0);    }    if (!resetText) {        if (count >= 2) {//表情符号的字符长度最小为2           // CharSequence input = s.subSequence(cursorPos, cursorPos + count);//这里有问题,在一些输入法里会报出角标越界的错误
修改如下:
            CharSequence input = s.subSequence(start, start + count);
if (containsEmoji(input.toString())) {
                                    resetText = true;                
                      Toast.makeText(mContext, "不支持输入Emoji表情符号", Toast.LENGTH_SHORT).show();  //是表情符号就将文本还原为输入表情符号之前的内容        
                      setText(inputAfterText);               
                   CharSequence text = getText();                
               if (text instanceof Spannable) {                   
                      Spannable spanText = (Spannable)text;   
                       Selection.setSelection(spanText, text.length());               
                     }           
                }       
      }   
           } else {      
       resetText = false;    }}
         @Override
        public void afterTextChanged(Editable s) {
}
        @Override
         public void onFocusChange(View v, boolean hasFocus) {    
                    if (hasFocus) {      
                setClearIconVisible(getText().length()>0);    }    
          else {       
                   setClearIconVisible(false);    }}
         @Override
         public boolean onTouch(View v, MotionEvent event) {   
 if (event.getAction()==MotionEvent.ACTION_UP) {   
     int x= (int) event.getX();      
  if (x>getWidth()-getPaddingRight()-drawable.getIntrinsicWidth() && drawable.isVisible()) {       
     setText("");        }    }    return false;}
    /  ** * 检测是否有emoji表情 * * @param source * @return */
     public static boolean containsEmoji(String source) {    
      int len = source.length();  
       for (int i = 0; i < len; i++) {      
  char codePoint = source.charAt(i);      
  if (!isEmojiCharacter(codePoint)) { //如果不能匹配,则该字符是Emoji表情         
   return true;        }    
}    return false;}
/** * 判断是否是Emoji * * @param codePoint 比较的单个字符 * @return */
private static boolean isEmojiCharacter(char codePoint) {    
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) ||    
        (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||           
 ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000)         
   && (codePoint <= 0x10FFFF));}

原创粉丝点击