【移動應(yīng)用開發(fā)技術(shù)】Android EditText如何實現(xiàn)每4位自動添加空格效果_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android EditText如何實現(xiàn)每4位自動添加空格效果_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android EditText如何實現(xiàn)每4位自動添加空格效果_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android EditText如何實現(xiàn)每4位自動添加空格效果_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Android EditText如何實現(xiàn)每4位自動添加空格效果_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】AndroidEditText如何實現(xiàn)每4位自動添加空格效果

這篇文章主要介紹AndroidEditText如何實現(xiàn)每4位自動添加空格效果,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!基本功能剛拿到需求,很簡單的一個功能,二話不說,很快就出來了:完美!順利上線!沒過幾天領(lǐng)導(dǎo)拿著手機過來說:“這一堆數(shù)字在一起看著很費勁,像其他App一樣,加個空格吧!”于是就有了這個demo。拓展功能下面就來在基本功能上做拓展:每4位,自動添加空格。看似很小的功能,在開發(fā)的過程中,遇到了非常多的問題與難點:EditText輸入框監(jiān)聽死循環(huán)輸入框中的空格無法刪除(刪除又添加)從中間刪除一個數(shù)字產(chǎn)生的一系列問題輸入框光標(biāo)位置的控制問題之前踩坑的過程就不再贅述了,太心酸經(jīng)過一系列的實驗,最后定下來的思路如下:當(dāng)輸入框的內(nèi)容改變時,就將內(nèi)容取出拆分為一個一個的字符,在每4位的中間添加空格,最后一個4位不能添加。用這種拼接字符的方法是為了解決當(dāng)用戶刪除中間的數(shù)字,會導(dǎo)致空格位置錯位的問題。當(dāng)用戶刪除中間的字符時,要記錄該動作并且記錄光標(biāo)位置,保證重新排序完成后,光標(biāo)的位置在應(yīng)該在的位置。大概就這2步,就可以實現(xiàn)這個功能,下面一步一來,我們先實現(xiàn)空格的添加,保證內(nèi)容永遠滿足4位后一個空格:下面先看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)在最后,因為每次setText都會導(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);

}

});沒有難點,重新拼接字符串我單獨封裝了出來:public

static

String

addSpeaceByCredit(String

content)

{

if

(TextUtils.isEmpty(content))

{

return

"";

}

//去空格

content

=

content.replaceAll("

",

"");

if

(TextUtils.isEmpty(content))

{

return

"";

}

//卡號限制為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位時,并且不是最后一個第4位時

//拼接字符的同時,拼接一個空格

//如果在最后一個第四位也拼接,會產(chǎn)生空格無法刪除的問題

//因為一刪除,馬上觸發(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)該問題不大,下面運行一下:完美!空格正常添加了!但是光標(biāo)亂跳的問題,我特地演示了一下。用字符排序的方式來做這個功能的原因是這個,當(dāng)用戶從中間刪除字符時,我們需要將所有添加的空格位置都進行審查,并重新進行空格的添加,所以我認(rèn)為重新排序字符是非常恰當(dāng)?shù)囊环N做法。當(dāng)然這僅僅是我的愚見,可能有更優(yōu)的做法。現(xiàn)在我們就要進行第二步,當(dāng)用戶刪除中間字符時,我們要判斷用戶本次操作是刪除字符,并且保存本次刪除的光標(biāo)位置,在刪除完成、排序完成之后,將光標(biāo)移動到保存的光標(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)

{

//因為重新排序之后setText的存在

//會導(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);

//如果最新的長度

<

上次的長度,代表進行了刪除

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

}

//判斷是否滿足信用卡格式,注

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論