簡述
在Android 開發(fā)中,肯定有小伙伴們有遇到要處理輸入金額的問題。希望這邊的方法能給需要的人提供下靈感。
老規(guī)矩先上圖:

布局設(shè)置
本案例寫了一點(diǎn)點(diǎn)UI,這邊就截圖看個(gè)大概,相信大伙都能看得懂

其中重點(diǎn)看看EditText 的設(shè)置
<EditText
android:id="@+id/edt_money"
android:text=""
android:background="@null"
android:hint="請(qǐng)輸入充值金額"
android:maxLines="1"
android:maxLength="15"
android:inputType="numberDecimal"
android:textSize="16sp"
android:imeOptions="actionDone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="20dp" />
設(shè)置了輸入類型inputType 的屬性為numberDecimal,只允許其輸入帶小數(shù)點(diǎn)的浮點(diǎn)格式。而imeOptions設(shè)置為actionDone屬性,則是為了設(shè)置輸入法軟盤右下角的按鈕為完成按鈕,當(dāng)點(diǎn)擊的時(shí)候,會(huì)關(guān)閉軟盤。
底部的輸入金額按鈕,則只是簡單設(shè)置了個(gè)選擇器,當(dāng)能點(diǎn)擊時(shí)為藍(lán)色,不可點(diǎn)擊時(shí)設(shè)置為灰色,在此就不貼出截圖了。
現(xiàn)在來看看主界面在初始化與綁定控件后,輸入框的代碼邏輯,我們通過EditText的addTextChangedListener來監(jiān)聽用戶的輸入狀態(tài),在用戶輸入完畢后afterTextChanged 方法中判斷輸入內(nèi)容是否合法,合法則允許點(diǎn)擊充值金額按鈕,否則置灰不可點(diǎn)擊。
主界面代碼(文末貼出 MainActivity 類完整代碼)
setEditChangedListener函數(shù)監(jiān)聽代碼如下()
private void setEditChangedListener() {
edt_money.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) {
String temp = s.toString();
int posDot = temp.indexOf(".");
if (posDot > 0) if (temp.length() - posDot - 1 > 2) {
s.delete(posDot + 3, posDot + 4);
}
tv_pay.setEnabled(ifCanChargeMoney());
}
});
}
其中 posDot 是用來判斷 符號(hào)" . " 在字符串中第一次出現(xiàn)的索引,有則返回下標(biāo)位置,沒有則返回 -1 ,若是出現(xiàn),則再繼續(xù)判斷輸入的數(shù)值長度的小數(shù)點(diǎn)位數(shù)是否大于2位,若是大于2為,則刪除掉后面的小數(shù)位數(shù)值,只留兩位小數(shù)。
ifCanChargeMoney() 則是用于判斷最后輸入數(shù)值是否符合格式,若符合則輸入金額按鈕可點(diǎn)擊,代碼如下:
private boolean ifCanChargeMoney() {
//輸入為空
if (TextUtils.isEmpty(edt_money.getText().toString())) return false;
//獲取輸入余額
balance=edt_money.getText().toString();
//判斷格式是否符合金額
if (!balance.matches(Money)) return false;
//判斷金額不能小于等于 0
if(Double.parseDouble(balance)<=0) return false;
return true;
}
其中Money 是金額的正則,范圍 0.00~9999999999.99
String Money="(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";
自此,簡單實(shí)現(xiàn)了輸入金額判斷與處理,現(xiàn)在貼上MainActivity 類的完整代碼:
public class MainActivity extends AppCompatActivity {
private EditText edt_money;
private TextView tv_pay;
private String balance;
//金額正則 0.00~9999999999.99
String Money="(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setEditChangedListener();
onClickEvent();
}
private void onClickEvent() {
tv_pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"輸入金額:"+balance,Toast.LENGTH_SHORT).show();
}
});
}
private boolean ifCanChargeMoney() {
//輸入為空
if (TextUtils.isEmpty(edt_money.getText().toString())) return false;
//獲取輸入余額
balance=edt_money.getText().toString();
//判斷格式是否符合金額
if (!balance.matches(Money)) return false;
//判斷金額不能小于等于 0
if(Double.parseDouble(balance)<=0) return false;
return true;
}
private void setEditChangedListener() {
edt_money.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) {
String temp = s.toString();
int posDot = temp.indexOf(".");
if (posDot > 0) if (temp.length() - posDot - 1 > 2) {
s.delete(posDot + 3, posDot + 4);
}
tv_pay.setEnabled(ifCanChargeMoney());
}
});
}
private void initView() {
edt_money=findViewById(R.id.edt_money);
tv_pay=findViewById(R.id.tv_pay);
}
}
大致方法就這樣,希望能給小伙伴們提供到一點(diǎn)幫助
參考閱讀過的博客:https://blog.csdn.net/zuo_er_lyf/article/details/79715182