自定义textWatcher实现editText输入框的输入固定的字节数的目的

最近做一个即时通讯项目,由于发送文本信息需要限定字节数,如果超过字节数信息会发送失败,因此可以通过提示用户达到输入的最大字符数。
考虑到的场景:
1,用户正常输入一串字符串,达到允许输入的最大字节数 ,提示用户;
2,输入框内的字符串已经的达到允许用户输入的最大字符串,如果用户在中间插入一段字符串,会将末尾的字符串删掉一部分,保留插入的一部分,
案例:用户输入不同的字符串,含中文,数字,字母
核心代码:

/*
 * 监听输入内容是否超出最大长度,并设置光标位置
 */
public class MaxLengthWatcher implements TextWatcher {
  String myStr = null;
  private int maxLen = 0;
  private EditText editText = null;
  private Context context;
  private Toast myToast;
  protected static final String TAG = MaxLengthWatcher.class.getSimpleName();
  private String oldStr;
  boolean deletFlag;
   private  String  mToastText;


/**
 * 
 * @param context
 * @param maxLen  允许输入的最大字符数如允许输入为5个,则赋值为6,
 * @param editText  监听的控件
 * @param toastText   超过最大弹出的提示
 */
  public MaxLengthWatcher(Context context, int maxLen, EditText editText,String toastText) {
    this.maxLen = maxLen;
    this.editText = editText;
    this.context = context;
      mToastText=toastText;
      if(mToastText==null){
        mToastText="达到最大可发送字节数";
      }
    myToast = new MyToast(context);
    // this.editable = editText.getText();
  }

  public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub

  }

  public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    Log.d(TAG, "beforeTextChanged arg1=" + arg1 + "arg2=" + arg2 + "arg3=" + arg3);

  }

  public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    Log.d(TAG, "onTextChangedarg1=" + arg1 + "arg2=" + arg2 + "arg3=" + arg3);
    if (arg2 != 0) {
      deletFlag = true;

    }
    Editable editable = editText.getText();
    int len = editable.length();
    StringBuffer sb = new StringBuffer();
    sb.delete(0, sb.length());
    int len1 = 0;
    char[] charstr = arg0.toString().toCharArray();

    for (int i = 0; i < charstr.length; i++) {

      if (len1 < maxLen) {
        char[] newChar = new char[1];
        newChar[0] = charstr[i];
        String str = new String(newChar);
        try {
          len1 = len1 + str.getBytes("UTF-8").length;
        } catch (UnsupportedEncodingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        sb.append(charstr[i]);
      }

    }
    // Log.d(TAG, "================" + sb.toString() + "len1 =" + len1);
    if (len1 >= maxLen) {
        if (!myToast.isStart()) {

            myToast.setText(mToastText);
            myToast.show();
          } else {
            myToast.cancel();
            myToast.setText(mToastText);
            myToast.show();
          }
      int selEndIndex = Selection.getSelectionEnd(editable);
      String str = editable.toString();
      String newStr = null;
      Log.d(TAG, "selEndIndex=" + selEndIndex + "str.length()=" + str.length());
        // 截取新字符串
        newStr = str.substring(0, sb.length() - 1);

        editable.clear();
        editable.append(newStr);
        deletFlag = false;
        oldStr = newStr;
        Log.d(TAG, "editable.length()=" + editable.length());

      // 设置新光标所在的位置
      selEndIndex = Selection.getSelectionEnd(editable);
      Selection.setSelection(editable, selEndIndex);
    }
  }

}

如何简单的使用:

//需要监听的EditText btn_message_edite;
//允许输入的最大字节数 int maxSentlenth;
//输入最大后,提示用户的字符串 toastStr;

btn_message_edite.addTextChangedListener(new MaxLengthWatcher(mContext, maxSentlenth, btn_message_edite,
                toastStr));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值