欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android的EditText字数检测和限制解决办法

程序员文章站 2023-12-13 17:36:04
android的edittext字数检测和限制解决办法 控件edittext在android布局中经常用到,对edittext中输入的内容也经常需要进行限制,我们可以通过...

android的edittext字数检测和限制解决办法

控件edittext在android布局中经常用到,对edittext中输入的内容也经常需要进行限制,我们可以通过textwatcher去观察输入框中输入的内容。

public class textwatcherdemo extends activity {
  private textview mtextview;
  private edittext medittext;
  /** called when the activity is first created. */
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    mtextview = (textview)findviewbyid(r.id.tv);
    medittext = (edittext)findviewbyid(r.id.et);
    medittext.addtextchangedlistener(mtextwatcher);
  }
  textwatcher mtextwatcher = new textwatcher() {
    private charsequence temp;
    private int editstart ;
    private int editend ;
    @override
    public void beforetextchanged(charsequence s, int arg1, int arg2,
        int arg3) {
      temp = s;
    }
    
    @override
    public void ontextchanged(charsequence s, int arg1, int arg2,
        int arg3) {
      mtextview.settext(s);
    }
    
    @override
    public void aftertextchanged(editable s) {
      editstart = medittext.getselectionstart();
      editend = medittext.getselectionend();
      if (temp.length() > 10) {
        toast.maketext(textwatcherdemo.this,
            "你输入的字数已经超过了限制!", toast.length_short)
            .show();
        s.delete(editstart-1, editend);
        int tempselection = editstart;
        medittext.settext(s);
        medittext.setselection(tempselection);
      }
    }
  };
}

关于android中的编码

result.getbytes() 是 new string(byte[]) 的逆过程。

前面那个是 string->byte[] ,后面那个是 byte[] -> string.

在java运行时的时候,string与string是没有区别的都是以2字节的unicode的形式存在内存中,所谓编码,是针对把string转换成 byte[]而言的。比如我可以把 "abc" 通过 utf-8转换成了一串数据 a ,也可以通过gb2312转换成另一串数据 b,这个过程就是 string.getbytes(),比如 "abc".getbytes("utf-8")得到a , "abc".getbytes("gb2312")得到b。如果是"abc".getbytes(),就不知道用的什么编码了,这和平台相关。

那如何从a串或者 b串重新得到string呢,那就是 new string(a,"utf-8") 或者 new string(b,"gb2312")。因为a是从utf-8转换得到的,所以用utf-8转回string ,如果new string(a,"gb2312"), 那么其中的中文就是乱码。

下面列出各编码格式下字符的字节数:

英文字母:a

字节数:1;编码:gb2312 
字节数:1;编码:gbk 
字节数:1;编码:gb18030 
字节数:1;编码:iso-8859-1 
字节数:1;编码:utf-8 
字节数:4;编码:utf-16 
字节数:2;编码:utf-16be 
字节数:2;编码:utf-16le 

中文汉字:人

字节数:2;编码:gb2312 
字节数:2;编码:gbk 
字节数:2;编码:gb18030 
字节数:1;编码:iso-8859-1 
字节数:3;编码:utf-8 
字节数:4;编码:utf-16 
字节数:2;编码:utf-16be 
字节数:2;编码:utf-16le 

根据上面的结果,我们可以通过每个字符的utf-8字节数来判断是中文还是英文。

工作中遇到一个需求,是要限制edittext中输入的字符数的个数,中文15个,英文30个,中英文会交叉输入,就可以用上面的条件来判断。

具体的实现如下:

 private textwatcher minputtextwatcher = new textwatcher() {
    private string temp;
    private int editstart;
    private int editend;

    @override
    public void ontextchanged(charsequence s, int start, int before, int count) {
      temp = s.tostring();
    }

    @override
    public void beforetextchanged(charsequence s, int start, int count, int after) {
    }

    @override
    public void aftertextchanged(editable s) {
      mmainhandler.removemessages(hd_msg_update_hint);
      mcurrenthint = s.tostring().trim();

      if (!textutils.isempty(temp)) {
        string limitsubstring = getlimitsubstring(temp);
        if (!textutils.isempty(limitsubstring)) {
          if (!limitsubstring.equals(temp)) {
            // toast.maketext(activity, "字数已超过限制",
            // toast.length_short).show();
            medtinput.settext(limitsubstring);
            medtinput.setselection(limitsubstring.length());
          }
        }
      }
      mmainhandler.sendemptymessagedelayed(hd_msg_update_hint, hint_update_daley_time);
    }
  };

  

private string getlimitsubstring(string inputstr) {
    int orignlen = inputstr.length();
    int resultlen = 0;
    string temp = null;
    for (int i = 0; i < orignlen; i++) {
      temp = inputstr.substring(i, i + 1);
      try {// 3 bytes to indicate chinese word,1 byte to indicate english
         // word ,in utf-8 encode
        if (temp.getbytes("utf-8").length == 3) {
          resultlen += 2;
        } else {
          resultlen++;
        }
      } catch (unsupportedencodingexception e) {
        e.printstacktrace();
      }
      if (resultlen > 30) {
        return inputstr.substring(0, i);
      }
    }
    return inputstr;
  }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: