溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android如何實(shí)現(xiàn)EditText每4位自動(dòng)添加空格效果

發(fā)布時(shí)間:2021-09-28 14:26:18 來源:億速云 閱讀:204 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Android如何實(shí)現(xiàn)EditText每4位自動(dòng)添加空格效果”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android如何實(shí)現(xiàn)EditText每4位自動(dòng)添加空格效果”這篇文章吧。

思路如下:

當(dāng)輸入框的內(nèi)容改變時(shí),就將內(nèi)容取出拆分為一個(gè)一個(gè)的字符,在每4位的中間添加空格,最后一個(gè)4位不能添加。用這種拼接字符的方法是為了解決當(dāng)用戶刪除中間的數(shù)字,會(huì)導(dǎo)致空格位置錯(cuò)位的問題。  當(dāng)用戶刪除中間的字符時(shí),要記錄該動(dòng)作并且記錄光標(biāo)位置,保證重新排序完成后,光標(biāo)的位置在應(yīng)該在的位置。

大概就這2步,就可以實(shí)現(xiàn)這個(gè)功能,下面一步一來,我們先實(shí)現(xiàn)空格的添加,保證內(nèi)容永遠(yuǎn)滿足4位后一個(gè)空格:

下面先看EditText的監(jiān)聽:

et_credit_number.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) {  //獲取輸入框中的內(nèi)容,不可以去空格  String etContent = EditTextUtils.getText(et_credit_number);  if (TextUtils.isEmpty(etContent)) {   bt_submit.setEnabled(false);   return;  }  //重新拼接字符串  String newContent = AppUtils.addSpeaceByCredit(etContent);  //如果有改變,則重新填充  //防止EditText無限setText()產(chǎn)生死循環(huán)  if (!etContent.equals(newContent)) {   et_credit_number.setText(newContent);   //保證光標(biāo)在最后,因?yàn)槊看蝧etText都會(huì)導(dǎo)致光標(biāo)重置   //這樣最基本地解決了光標(biāo)亂跳的問題   et_credit_number.setSelection(newContent.length());  }  //判斷是否滿足信用卡格式,注意去空格判斷  if (MatcheUtils.isCreditNumber(newContent.replaceAll(" ", ""))) {   bt_submit.setEnabled(true);   return;  }  bt_submit.setEnabled(false); }});

沒有難點(diǎn),重新拼接字符串我單獨(dú)封裝了出來:

public static String addSpeaceByCredit(String content) { if (TextUtils.isEmpty(content)) {  return ""; } //去空格 content = content.replaceAll(" ", ""); if (TextUtils.isEmpty(content)) {  return ""; } //卡號(hào)限制為16位 if (content.length() > 16) {  content = content.substring(0, 16); } StringBuilder newString = new StringBuilder(); for (int i = 1; i <= content.length(); i++) {  //當(dāng)為第4位時(shí),并且不是最后一個(gè)第4位時(shí)  //拼接字符的同時(shí),拼接一個(gè)空格  //如果在最后一個(gè)第四位也拼接,會(huì)產(chǎn)生空格無法刪除的問題  //因?yàn)橐粍h除,馬上觸發(fā)輸入框改變監(jiān)聽,又重新生成了空格  if (i % 4 == 0 && i != content.length()) {   newString.append(content.charAt(i - 1) + " ");  } else {  //如果不是4位的倍數(shù),則直接拼接字符即可   newString.append(content.charAt(i - 1));  } } return newString.toString();}

這里每一步的含義,我都寫了注釋,應(yīng)該問題不大,下面運(yùn)行一下:

完美!空格正常添加了!

但是光標(biāo)亂跳的問題,我特地演示了一下。

用字符排序的方式來做這個(gè)功能的原因是這個(gè),當(dāng)用戶從中間刪除字符時(shí),我們需要將所有添加的空格位置都進(jìn)行審查,并重新進(jìn)行空格的添加,所以我認(rèn)為重新排序字符是非常恰當(dāng)?shù)囊环N做法。當(dāng)然這僅僅是我的愚見,可能有更優(yōu)的做法。

現(xiàn)在我們就要進(jìn)行第二步,當(dāng)用戶刪除中間字符時(shí),我們要判斷用戶本次操作是刪除字符,并且保存本次刪除的光標(biāo)位置,在刪除完成、排序完成之后,將光標(biāo)移動(dòng)到保存的光標(biāo)位置。

思路有了,下面就看最終代碼好了。

輸入框監(jiān)聽的代碼:

et_credit_number.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) {  //因?yàn)橹匦屡判蛑髎etText的存在  //會(huì)導(dǎo)致輸入框的內(nèi)容從0開始輸入,這里是為了避免這種情況產(chǎn)生一系列問題  if (start == 0 && count > 0) {   return;  }  String editTextContent = EditTextUtils.getText(et_credit_number);  if (TextUtils.isEmpty(editTextContent) || TextUtils.isEmpty(lastString)) {   return;  }  editTextContent = AppUtils.addSpeaceByCredit(editTextContent);  //如果最新的長度 < 上次的長度,代表進(jìn)行了刪除  if (editTextContent.length() <= lastString.length()) {   deleteSelect = start;  } else {   deleteSelect = editTextContent.length();  } } @Override public void afterTextChanged(Editable s) {  //獲取輸入框中的內(nèi)容,不可以去空格  String etContent = EditTextUtils.getText(et_credit_number);  if (TextUtils.isEmpty(etContent)) {   bt_submit.setEnabled(false);   return;  }  //重新拼接字符串  String newContent = AppUtils.addSpeaceByCredit(etContent);  //保存本次字符串?dāng)?shù)據(jù)  lastString = newContent;  //如果有改變,則重新填充  //防止EditText無限setText()產(chǎn)生死循環(huán)  if (!etContent.equals(newContent)) {   et_credit_number.setText(newContent);   //保證光標(biāo)的位置   et_credit_number.setSelection(deleteSelect > newContent.length() ? newContent.length() : deleteSelect);  }  //判斷是否滿足信用卡格式,注意去空格判斷  if (MatcheUtils.isCreditNumber(newContent.replaceAll(" ", ""))) {   bt_submit.setEnabled(true);   return;  }  bt_submit.setEnabled(false); }});

這邊主要利用了onTextChanged()的監(jiān)聽,判斷用戶操作是刪除操作時(shí),保存光標(biāo)的位置。

以上是“Android如何實(shí)現(xiàn)EditText每4位自動(dòng)添加空格效果”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI