Android EditText之输入限制设置

转载:https://blog.csdn.net/shenggaofei/article/details/106314909

Android EditText之输入限制设置,适用于常用的产品需求

 inputType属性:

android:inputType=none:普通字符。
android:inputType=text:普通字符。
android:inputType=textCapCharacters:字母大写。
android:inputType=textCapWords:首字母大写。
android:inputType=textCapSentences:仅第一个字母大写。
android:inputType=textAutoCorrect:自动完成。
android:inputType=textAutoComplete:自动完成。
android:inputType=textMultiLine:多行输入。
android:inputType=textImeMultiLine:输入法多行(如果支持)。
android:inputType=textNoSuggestions:不提示。
android:inputType=textUri:网址。
android:inputType=textEmailAddress:电子邮件地址。
android:inputType=textEmailSubject:邮件主题。
android:inputType=textShortMessage:短讯。
android:inputType=textLongMessage:长信息。
android:inputType=textPersonName:人名。
android:inputType=textPostalAddress:地址。
android:inputType=textPassword:密码。
android:inputType=textVisiblePassword:可见密码。
android:inputType=textWebEditText:作为网页表单的文本。
android:inputType=textFilter:文本筛选过滤。
android:inputType=textPhonetic:拼音输入。
android:inputType=number:数字。
android:inputType=numberSigned:带符号数字格式。
android:inputType=numberDecimal:带小数点的浮点格式。
android:inputType=phone:拨号键盘。
android:inputType=datetime:时间日期。
android:inputType=date:日期键盘。
android:inputType=time:时间键盘。

1.EditText限制不可以以0或小数点(.)开头

2.EditText限制输入价格控制位数(小数点前几位,小数点后几位)

上面两个需求实现如下:

a.自定义一个TextWatcher:

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
/**
 * EditText内容输入限制最大:小数点前五位,小数点后2位
 */
 
public class EditTextJudgeNumberWatcher implements TextWatcher {
    private EditText editText;
 
    public EditTextJudgeNumberWatcher(EditText editText) {
        this.editText = editText;
    }
 
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
    }
 
    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
    }
 
    @Override
    public void afterTextChanged(Editable editable) {
        judgeNumber(editable,editText);
    }
 
    /**
     * 金额输入框中的内容限制(最大:小数点前五位,小数点后2位)
     *
     * @param edt
     */
    public static void judgeNumber(Editable edt,EditText editText) {
 
        String temp = edt.toString();
        int posDot = temp.indexOf(".");//返回指定字符在此字符串中第一次出现处的索引
        int index = editText.getSelectionStart();//获取光标位置
        //  if (posDot == 0) {//必须先输入数字后才能输入小数点
        //  edt.delete(0, temp.length());//删除所有字符
        //  return;
        //  }
 
        //--
        int len = temp.toString().length();
        //若0或.开头就设置不显示,必须是大于0的正整数开头
        if (len >= 1 && temp.startsWith("0")||temp.startsWith(".")) {
            edt.replace(0,1,"");
//                editable.clear();
        }
        if (posDot < 0) {//不包含小数点
            if (temp.length() <= 5) {
                return;//小于五位数直接返回
            } else {
                edt.delete(index-1, index);//删除光标前的字符
                return;
            }
        }
        if (posDot > 5) {//小数点前大于5位数就删除光标前一位
            edt.delete(index-1, index);//删除光标前的字符
            return;
        }
        if (temp.length() - posDot - 1 > 2)//如果包含小数点
        {
            edt.delete(index-1, index);//删除光标前的字符
            return;
        }
    }
}
b.

 etNumber = findViewById(R.id.et_number);
//设置使用
        etNumber.addTextChangedListener(new EditTextJudgeNumberWatcher(etNumber));
c.布局:

  <com.example.qd.douyinwu.utils.ExtendedEditText
            android:id="@+id/et_number"
            style="@android:style/Widget.Holo.EditText"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:padding="4dp"
            android:gravity="center|left"
            android:textSize="24dp"
            android:hint="请输入数字"
            android:inputType="numberDecimal"
            app:buttonAlwaysCenter="true" />
自定义输入框ExtendedEditText:https://blog.csdn.net/shenggaofei/article/details/106313483

d.保存时设置;

DecimalFormat df = new DecimalFormat("0.00");
df.format(doubleData)
3.EditText限制可以输入0,但不能输入0开头的数字

 etNumber.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 text = s.toString();
                int len = s.toString().length();
                if (len > 1 && text.startsWith("0")) {
                    s.replace(0,1,"");
                }
            }
        });
 /**
     * 设置不能以0开头
     * @param editText
     */
    public static void setTaskSample(final EditText editText){
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void afterTextChanged(Editable editable) {
                String editTextString = editable.toString();
                if(!TextUtils.isEmpty(editTextString)){
                    int len = editTextString.length();
                    //若0或.开头就设置不显示,必须是大于0的正整数开头
                    if (len >= 1 && editTextString.startsWith("0") || editTextString.startsWith(".")) {
                        editable.replace(0, 1, "");
                    }
                }
            }
        });
    }
 

4.EditText,只输入汉字和英文:

/**
 * 自定义的只能输入汉字和英文的Edittext
 * 
 */
 
public class CustomEditText extends EditText {
    public CustomEditText(Context context) {
        super(context);
    }
 
    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
 
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new mInputConnection(super.onCreateInputConnection(outAttrs), false);
 
    }
 
 
    class mInputConnection extends InputConnectionWrapper implements InputConnection {
 
        /**
         * Initializes a wrapper.
         * <p>
         * <p><b>Caveat:</b> Although the system can accept {@code (InputConnection) null} in some
         * places, you cannot emulate such a behavior by non-null {@link InputConnectionWrapper} that
         * has {@code null} in {@code target}.</p>
         *
         * @param target  the {@link InputConnection} to be proxied.
         * @param mutable set {@code true} to protect this object from being reconfigured to target
         *                another {@link InputConnection}.  Note that this is ignored while the target is {@code null}.
         */
        public mInputConnection(InputConnection target, boolean mutable) {
            super(target, mutable);
        }
 
        //拦截内容
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            // 只能输入汉字或者英文
            if (!text.toString().matches("[\u4e00-\u9fa5]+") && !text.toString().matches("[a-zA-Z /]+")) {
                return false;
            }
            return super.commitText(text, newCursorPosition);
        }
 
        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            return super.sendKeyEvent(event);
        }
 
        @Override
        public boolean setSelection(int start, int end) {
            return super.setSelection(start, end);
        }
    }
}
判断输入的内容是否是纯英文或纯汉字:

//前提是传入的字符串只包含汉字和英文
 // 判断一个字符串0格式不纯   2是纯英文  或者1纯汉语
    public static int isChineseOrEngLish(String str) {
        if (str == null)
            return 0;
        //判断是否含有汉字
        Boolean isChinese = false;
        for (char c : str.toCharArray()) {
            if (isChinese(c)) {
                isChinese = true;// 有一个中文字符就返回
            }
        }
        //判断是否含有英文
        Boolean isLetter = false;
        for (char c : str.toCharArray()) {
            if (isLetter("" + c))
                isLetter = true;// 有一个中文字符就返回
        }
        if (isChinese && !isLetter) {//是纯汉字
            return 1;
        } else if (!isChinese && isLetter) {//是纯英文
            return 2;
        }
        return 0;
    }
 
    // 判断一个字符是否是中文
    public static boolean isChinese(char c) {
        return c >= 0x4E00 && c <= 0x9FA5;// 根据字节码判断
    }
 
    //判断一个字符是否是英文字母
    public static boolean isLetter(String c) {
        return c.matches("[a-zA-Z /]+");
    }
/**
     * 只可以输入汉字和英文
     * @param editText
     */
    public static boolean setChineseAndEnglishJudgment(EditText editText){
        Pattern p = Pattern.compile("[a-zA-Z|\u4e00-\u9fa5]+");
        Matcher m = p.matcher(editText.getText().toString());
        if (!m.matches()){
            //说明输入不符合判断
            return false;
        }else {
            return true;
        }
    }
 

5.判断输入的是否是数字:

 /**
     * 判断字符串中是否是数字
     * @param str
     * @return
     */
    public static boolean isNumeric(String str){
        if(!TextUtils.isEmpty(str)){
            Pattern pattern = Pattern.compile("[0-9]*");
            Matcher isNum = pattern.matcher(str);
            if( !isNum.matches() ){
                return false;
            }
        }
        return true;
    }
6.禁止输入空格或特殊字符:

/**
     * 禁止EditText输入空格和特殊字符
     *
     * @param editText
     */
    public static void setEditTextInhibitInputSpaChat(EditText editText) {
        InputFilter filter_space = new InputFilter() {//禁止空格处理
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (source.equals(" "))
                    return "";
                else
                    return null;
            }
        };
        InputFilter filter_speChat = new InputFilter() {//特殊字符处理
            @Override
            public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
                Pattern pattern = Pattern.compile(ConstUtils.PROHIBITED_SPECHAT);
                Matcher matcher = pattern.matcher(charSequence.toString());
                if (matcher.find()) return "";
                else return null;
            }
        };
        editText.setFilters(new InputFilter[]{filter_space, filter_speChat});
    }
 

public static final String PROHIBITED_SPECHAT = "[`~!@#_$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()— +|{}【】‘;:”“’。,、?]";
EditTextUtils.setEditTextInhibitInputSpaChat(et_username);//设置启用限制方法

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值