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

首先创建一个类继承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]);
}
/****************************以下是禁止输入表情的代码**************************************/
@Override
public 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();
    }
}

@Override
public 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));}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值