1. 程式人生 > >EditText表單驗證(三)

EditText表單驗證(三)

說明

綜合EditText表單驗證(一)EditText表單驗證(二)

使用

AutomaticCheckHandle

package data;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.EditText;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.self.zsp.dfs.R;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;

import org.litepal.LitePal;

import java.math.BigDecimal;
import java.util.List;

import entity.check.AutomaticCheck;
import entity.check.AutomaticCheckBean;
import okhttp3.Call;
import util.KeyboardUtils;
import util.LogUtils;
import value.Code;
import value.Url;
import widget.ZsDialog;

/**
 * Created on 2018/7/24.
 *
 * @desc 自動校驗處理
 */
public class AutomaticCheckHandle implements View.OnFocusChangeListener {
    /**
     * 上下文
     */
    private Context context;
    /**
     * 標誌
     */
    private int flag;
    /**
     * 最大/小值
     */
    private BigDecimal bigDecimalMin;
    private BigDecimal bigDecimalMax;
    /**
     * 最大/小提示
     */
    private String minHint;
    private String maxHint;

    /**
     * constructor
     */
    public AutomaticCheckHandle() {

    }

    /**
     * constructor
     *
     * @param context       上下文
     * @param flag          標誌
     * @param bigDecimalMin 最小值
     * @param minHint       最小提示
     */
    public AutomaticCheckHandle(Context context, int flag, BigDecimal bigDecimalMin, String minHint) {
        this.context = context;
        this.flag = flag;
        this.bigDecimalMin = bigDecimalMin;
        this.minHint = minHint;
    }

    /**
     * constructor
     *
     * @param context       上下文
     * @param flag          標誌
     * @param bigDecimalMin 最小值
     * @param bigDecimalMax 最大值
     * @param minHint       最小提示
     * @param maxHint       最大提示
     */
    public AutomaticCheckHandle(Context context, int flag, BigDecimal bigDecimalMin, BigDecimal bigDecimalMax, String minHint, String maxHint) {
        this.context = context;
        this.flag = flag;
        this.bigDecimalMin = bigDecimalMin;
        this.bigDecimalMax = bigDecimalMax;
        this.minHint = minHint;
        this.maxHint = maxHint;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            EditText editText = (EditText) v;
            String result = editText.getText().toString();
            if (!"".equals(result)) {
                BigDecimal bigDecimalResult = new BigDecimal(result);
                AutomaticCheck automaticCheck = LitePal.findFirst(AutomaticCheck.class);
                switch (flag) {
                    // 密度
                    case 1:
                        int minCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMin);
                        int maxCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMax);
                        if (minCompareResultMiddle < 0) {
                            formValidationRangeShow(editText, minHint);
                        } else if (maxCompareResultMiddle > 0) {
                            formValidationRangeShow(editText, maxHint);
                        } else {
                            automaticCheck(editText, result, automaticCheck);
                        }
                        break;
                    // FV
                    case 2:
                        int minCompareResultNotLess = bigDecimalResult.compareTo(bigDecimalMin);
                        if (minCompareResultNotLess < 0) {
                            formValidationRangeShow(editText, minHint);
                        } else {
                            automaticCheck(editText, result, automaticCheck);
                        }
                        break;
                    // PH
                    case 3:
                        minCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMin);
                        maxCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMax);
                        if (minCompareResultMiddle < 0) {
                            formValidationRangeShow(editText, minHint);
                        } else if (maxCompareResultMiddle > 0) {
                            formValidationRangeShow(editText, maxHint);
                        } else {
                            automaticCheck(editText, result, automaticCheck);
                        }
                        break;
                    // FL
                    case 4:
                        minCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMin);
                        maxCompareResultMiddle = bigDecimalResult.compareTo(bigDecimalMax);
                        if (minCompareResultMiddle < 0) {
                            formValidationRangeShow(editText, minHint);
                        } else if (maxCompareResultMiddle > 0) {
                            formValidationRangeShow(editText, maxHint);
                        } else {
                            automaticCheck(editText, result, automaticCheck);
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    }

    /**
     * 自動校驗
     *
     * @param editText       輸框
     * @param result         結果
     * @param automaticCheck 資料
     */
    private void automaticCheck(EditText editText, String result, AutomaticCheck automaticCheck) {
        if (automaticCheck != null) {
            Double resultDouble = Double.valueOf(result);
            String complexHint = automaticCheck.getFzts();
            switch (flag) {
                // 密度
                case 1:
                    String densityMin = automaticCheck.getDensityMin();
                    String densityMax = automaticCheck.getDensityMax();
                    if (densityMin != null && resultDouble < Double.valueOf(densityMin)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.densitySmaller), complexHint, densityMin, densityMax);
                    }
                    if (densityMax != null && resultDouble > Double.valueOf(densityMax)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.densityBigger), complexHint, densityMin, densityMax);
                    }
                    break;
                // FV
                case 2:
                    String fvMin = automaticCheck.getFvMin();
                    String fvMax = automaticCheck.getFvMax();
                    if (fvMin != null && resultDouble < Double.valueOf(fvMin)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.fvSmaller), complexHint, fvMin, fvMax);
                    }
                    if (fvMax != null && resultDouble > Double.valueOf(fvMax)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.fvBigger), complexHint, fvMin, fvMax);
                    }
                    break;
                // PH
                case 3:
                    String phMin = automaticCheck.getPhMin();
                    String phMax = automaticCheck.getPhMax();
                    if (phMin != null && resultDouble < Double.valueOf(phMin)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.phSmaller), complexHint, phMin, phMax);
                    }
                    if (phMax != null && resultDouble > Double.valueOf(phMax)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.phBigger), complexHint, phMin, phMax);
                    }
                    break;
                // FL
                case 4:
                    String flMin = automaticCheck.getFlMin();
                    String flMax = automaticCheck.getFlMax();
                    if (flMin != null && resultDouble < Double.valueOf(flMin)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.flSmaller), complexHint, flMin, flMax);
                    }
                    if (flMax != null && resultDouble > Double.valueOf(flMax)) {
                        automaticCheckRangeShow(editText, context.getString(R.string.flBigger), complexHint, flMin, flMax);
                    }
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * 提取範圍
     *
     * @param year             年份
     * @param block            區塊
     * @param constructionType 施工型別
     * @param wellNumber       井號
     * @param ground           地層
     */
    public void extractionRange(String year, String block, String constructionType, String wellNumber, String ground) {
        OkHttpUtils
                .get()
                .url(Url.AUTOMATIC_CHECK)
                .addParams("n", year)
                .addParams("qk", block)
                .addParams("sglx", constructionType)
                .addParams("jh", wellNumber)
                .addParams("dc", ground)
                .tag(this)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {

                    }

                    @Override
                    public void onResponse(String response, int id) {
                        LogUtils.e(response);
                        if (Code.flag(response)) {
                            AutomaticCheckBean automaticCheckBean = new Gson().fromJson(response, AutomaticCheckBean.class);
                            AutomaticCheckBean.DataBean dataBean = automaticCheckBean.getData();
                            // 範圍集合
                            List<AutomaticCheckBean.DataBean.ListBean> listBeans = dataBean.getList();
                            if (listBeans != null && listBeans.size() > 0) {
                                AutomaticCheck automaticCheck = new AutomaticCheck();
                                // 複雜提示
                                automaticCheck.setFzts(dataBean.getFzts());
                                for (AutomaticCheckBean.DataBean.ListBean listBean : listBeans) {
                                    switch (listBean.getCs()) {
                                        case "ρ":
                                            automaticCheck.setDensityMin(listBean.getZxz());
                                            automaticCheck.setDensityMax(listBean.getZdz());
                                            break;
                                        case "Fv":
                                            automaticCheck.setFvMin(listBean.getZxz());
                                            automaticCheck.setFvMax(listBean.getZdz());
                                            break;
                                        case "PH":
                                            automaticCheck.setPhMin(listBean.getZxz());
                                            automaticCheck.setPhMax(listBean.getZdz());
                                            break;
                                        case "FL":
                                            automaticCheck.setFlMin(listBean.getZxz());
                                            automaticCheck.setFlMax(listBean.getZdz());
                                            break;
                                        default:
                                            break;
                                    }
                                }
                                LitePal.deleteAll(AutomaticCheck.class);
                                automaticCheck.save();
                            }
                        } else {
                            if (LitePal.count(AutomaticCheck.class) > 0) {
                                LitePal.deleteAll(AutomaticCheck.class);
                            }
                        }
                    }
                });
    }

    /**
     * 表單驗證顯範圍
     *
     * @param editText 輸框
     * @param hint     提示
     */
    private void formValidationRangeShow(final EditText editText, String hint) {
        ZsDialog.materialStringContentDialogOneClick(context,
                hint,
                R.string.refill)
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                        dialog.dismiss();
                        KeyboardUtils.showKeyboardEditText(context, editText);
                    }
                }).cancelable(false).show();
    }

    /**
     * 自動校驗顯範圍
     *
     * @param editText    輸框
     * @param title       標題
     * @param complexHint 複雜提示
     * @param minValue    最小值
     * @param maxValue    最大值
     */
    private void automaticCheckRangeShow(final EditText editText, String title, String complexHint, String minValue, String maxValue) {
        ZsDialog.materialTitleContentDialogOneClick(context,
                title,
                ContextCompat.getColor(context, R.color.fontInput),
                complexHint + '\n' + '\n' + context.getString(R.string.minValue) + minValue + context.getString(R.string.maxValue) + maxValue,
                ContextCompat.getColor(context, R.color.fontHint),
                context.getString(R.string.refill))
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                        dialog.dismiss();
                        KeyboardUtils.showKeyboardEditText(context, editText);
                    }
                }).cancelable(false).show();
    }

    /**
     * 銷燬
     */
    public void automaticCheckDestroy() {
        OkHttpUtils.getInstance().cancelTag(this);
    }
}

主程式碼

單提
editText.setOnFocusChangeListener(new AutomaticCheckHandle(getContext(), 2, BigDecimal.valueOf(26), "粘度FV不可小於26"));
雙提
editText.setOnFocusChangeListener(new AutomaticCheckHandle(getContext(), 1, BigDecimal.valueOf(0.8), BigDecimal.valueOf(3.0), "密度ρ不可小於0.8", "密度ρ不可大於3.0"));

表單驗證