1. 程式人生 > >【Android】對EditText輸入金額新增限制及監聽

【Android】對EditText輸入金額新增限制及監聽

場景分析:

專案中我們需要在一個EditText控制元件中輸入金額,限制只能輸入數字,可以為小數但保留2位小數,同時監聽EditText一旦發現輸入金額大於0那麼使介面上的提交按鈕可點。

第一步:設定EditText的xml屬性

<EditText
    android:id="@+id/edt_money"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:inputType="numberDecimal"
    android:maxLength="12"
    android:singleLine="true"
    />
numberDecimal設定可輸入小數

maxLength設定可輸入的最大字元數

singleLine設定單行顯示

第二步:給EditText新增輸入過濾

import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 金額輸入過濾
 * Created by ccwant on 2016/9/8.
 */
public class CashierInputFilter  implements InputFilter{
    Pattern mPattern;

    //輸入的最大金額
    private static final int MAX_VALUE = Integer.MAX_VALUE;
    //小數點後的位數
    private static final int POINTER_LENGTH = 2;

    private static final String POINTER = ".";

    private static final String ZERO = "0";

    public CashierInputFilter() {
        mPattern = Pattern.compile("([0-9]|\\.)*");
    }

    /**
     * @param source    新輸入的字串
     * @param start     新輸入的字串起始下標,一般為0
     * @param end       新輸入的字串終點下標,一般為source長度-1
     * @param dest      輸入之前文字框內容
     * @param dstart    原內容起始座標,一般為0
     * @param dend      原內容終點座標,一般為dest長度-1
     * @return          輸入de內容
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String sourceText = source.toString();
        String destText = dest.toString();
        //驗證刪除等按鍵
        if (TextUtils.isEmpty(sourceText)) {
            return "";
        }
        Matcher matcher = mPattern.matcher(source);
        //已經輸入小數點的情況下,只能輸入數字
        if(destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source)) {  //只能輸入一個小數點
                    return "";
                }
            }
            //驗證小數點精度,保證小數點後只能輸入兩位
            int index = destText.indexOf(POINTER);
            int length = destText.length() - index;
            //如果長度大於2,並且新插入字元在小數點之後
            if (length > POINTER_LENGTH && index<dstart) {
                //超出2位返回null
                return "";
            }
        } else {
            //沒有輸入小數點的情況下,只能輸入小數點和數字,但首位不能輸入小數點
            if (!matcher.matches()) {
                return "";
            } else {
                if ((POINTER.equals(source)) && TextUtils.isEmpty(destText)) {
                    return "";
                }
            }
        }
        //驗證輸入金額的大小
        double sumText = Double.parseDouble(destText + sourceText);
        if (sumText > MAX_VALUE) {
            return dest.subSequence(dstart, dend);
        }
        return dest.subSequence(dstart, dend) + sourceText;
    }
}

第三步:設定輸入監聽
/**
     * 金額監聽器
     * 使用者監聽金額的輸入,從而控制按鈕
     */
    class MoneyTextWatcher implements TextWatcher {
        @Override
        public void afterTextChanged(Editable s) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(s.toString().trim().length()>0){
                final String m=s.toString();
                if(TextValidateUtil.isDouble(m)){
                    Double money=Double.parseDouble(m);
                    if(money>0){
                        mBtnSubmit.setEnabled(true);
                    }
                }else{
                    mBtnSubmit.setEnabled(false);
                }
            }else{
                mBtnSubmit.setEnabled(false);
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    }