国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android的EditText字數檢測和限制解決辦法

2019-12-12 03:27:15
字體:
來源:轉載
供稿:網友

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;  }

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 衡阳县| 密山市| 房产| 台安县| 克东县| 阜阳市| 五河县| 明水县| 玉溪市| 宝兴县| 阿拉善左旗| 阿坝县| 安泽县| 济源市| 宽城| 兴和县| 武城县| 银川市| 大名县| 龙门县| 泊头市| 华安县| 迭部县| 云南省| 内江市| 莱阳市| 黑龙江省| 大庆市| 西昌市| 宁波市| 新营市| 广东省| 蛟河市| 荔波县| 社会| 栾城县| 密云县| 海林市| 罗城| 乌什县| 武胜县|