Android EditText輸入字數限制總結(包括中文輸入記憶體溢出的解決方案)

來源:互聯網
上載者:User

標籤:記憶體溢出   android   字數限制   stackoverflow   edittext   


限定EditText輸入個數的解決方案很多,但是一般主要考慮兩點,也就是處理兩件事:
(1)不同語言字元(英文、中文等)處理方式
(2)輸入字元達到數目後,是否仍然允許使用者輸入

第一點,涉及的東東其實蠻多,不同語言在不同編碼中佔據位元組數等,不同語言在U8等編碼的表示範圍等,這一整塊知識很豐富,

              自己暫時沒有理的特別順,稍後整理再說吧。

第二點,目前主流app的處理方案也各有不同,qq5.0以前的版本,發表說說貌似是沒有字數限制的(我試了一個350字左右的照樣發),

              5.0以後限制了,這樣如果使用者輸入字數超過限制便顯示負數,但是仍然允許使用者輸入,就是不能發表了。這樣就把處理權全部交給使用者了,

             其實更省事了!

實現吧。

方法一:
布局中限制。
android:maxLength="10"  // 即限制最大輸入字元個數為10。
(1)中英文都算一個字元。
(2)字數到,不能輸入

方法二:
InputFilter限制,同布局中限制類似。
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)});
(1)中英文都算一個字元。
(2)字數到,不能輸入

方法三:
TextWatcher限制。這裡如果字數達到限制仍然允許使用者輸入的情況不多說,好實現。

crash問題:使用搜狗IME時,在字數將要或者已經達到限制之後,一次輸入大量中文(不按空格,一直打字,知道搜狗的緩衝字元達到上限),

                    crash,stackoverflow 記憶體溢出。呵呵,百度IME不會哈。

解決:監聽器中動態去除、添加就ok了。見下邊方案一

方案一,中文按兩個,英文按一個。個數到限制,使用者不能輸入
private TextWatcher textWatcher = new TextWatcher() {    private int editStart;    private int editEnd;    private int maxLen = 10; // the max byte@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {Log.d("TextChanged", "---->beforeTextChanged : start = " + start + " count = " + count + " after = " + after);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {editStart = opinion.getSelectionStart();editEnd = opinion.getSelectionEnd();// 先去掉監聽器,否則會出現棧溢出opinion.removeTextChangedListener(textWatcher);if (!TextUtils.isEmpty(opinion.getText())) {String etstring = opinion.getText().toString().trim();while (calculateLength(s.toString()) > maxLen) {s.delete(editStart - 1, editEnd);editStart--;editEnd--;Log.d("TextChanged", "editStart = " + editStart + " editEnd = " + editEnd);}}opinion.setText(s);opinion.setSelection(editStart);// 恢複監聽器opinion.addTextChangedListener(textWatcher);// end by zyf --------------------------}private int calculateLength(String etstring) {char[] ch = etstring.toCharArray();int varlength = 0;for (int i = 0; i < ch.length; i++) {// changed by zyf 0825 , bug 6918,加入中文標點範圍 , TODO 標點範圍有待具體化if ((ch[i] >= 0x2E80 && ch[i] <= 0xFE4F) || (ch[i] >= 0xA13F && ch[i] <= 0xAA40) || ch[i] >= 0x80) { // 中文字元範圍0x4e00 0x9fbbvarlength = varlength + 2;} else {varlength++;}}Log.d("TextChanged", "varlength = " + varlength);// 這裡也可以使用getBytes,更準確嘛        // varlength = etstring.getBytes(CharSet.forName("GBK")).lenght;// 編碼根據自己的需求,注意u8中文佔3個位元組...return varlength;}};


方案二
// 達到限制字數後,如果在文字中間輸入文字或者空格,最後的字元會被刪除
titleTv.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) { // add by zyf 0825 . 多餘的從新輸入的位置刪除,而不是最後   editStart = opinion.getSelectionStart();   editEnd = opinion.getSelectionEnd();if (!TextUtils.isEmpty(titleTv.getText())) {int varlength = 0;int size = 0;String etstring = titleTv.getText().toString().trim();char[] ch = etstring.toCharArray();for (int i = 0; i < ch.length; i++) {size++;if (ch[i] >= 0x4e00 && ch[i] <= 0x9fbb) {varlength = varlength + 2;} elsevarlength++;if (varlength > 80) {break;}}if (varlength > 80) { s.delete(size - 1, etstring.length()); // add by zyf 0825 . 多餘的從新輸入的位置刪除,而不是最後 // s.delete(editStart - 1, editEnd); // crash stackoverflow,解決方案參考上邊方案一}}}}); 


轉載請註明,大飛:http://blog.csdn.net/rflyee/article/details/38856539



Android EditText輸入字數限制總結(包括中文輸入記憶體溢出的解決方案)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.