转载: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);//设置启用限制方法

Android EditText之输入限制设置相关推荐

  1. android设置输入框输入字符限制,Android EditText限制输入字符的方法总结

    Android EditText限制输入字符的方法总结 最近项目要求限制密码输入的字符类型, 例如不能输入中文.   现在总结一下EditText的各种实现方式,  以比较各种方法的优劣. 第一种方式 ...

  2. android edittext 输入长度,Android EditText限制输入字数的方法

    本文实例讲述了Android EditText限制输入字数的方法.分享给大家供大家参考,具体如下: //新浪微博字数限制 private static final int WEIBO_CONTENT_ ...

  3. Android EditText组件drawableLeft属性设置的图片和hint设置的文字之间的距离

    有的时候,我们需要在文本框里放置icon图片,并且设置默认提示文字的时候,需要设置两者之间的间距,如下图: 这里想设置的就是之前的手机icon和"请输入手机号"之间的距离,则可是使 ...

  4. android edittext最多输入,android 中如何限制 EditText 最大输入字符数

    方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:android:maxLength="10" 即限制最大输入字符个数为10 方法二: 在代码中使用InputFilt ...

  5. Android EditText控制输入字符限制的方法

    EditText控制输入字符限制的方法 1 EditText的inputType属性 inputType属性用于设置EditText的输入类型,如number,只能输入数字,软键盘为数字键盘 1.1 ...

  6. maxlength不起作用android,Android EditText禁止输入Emoji后设置android:maxLength失效的问题...

    0X00 禁用emoji 有时候我们不想在EditText中输入Emoji表情,怎么处理呢? 我们可以通过设置InputFilter的方式来达到这个目的.怎么实现呢?直接上代码. public Inp ...

  7. Android 代码实现整数处理为小数,Android EditText限制输入整数和小数的位数的方法示例...

    直接上代码 新建DecimalInputTextWatcher类继承TextWatcher (代码可直接复制使用) import android.text.Editable; import andro ...

  8. Android EditText 字数限制以及设置中文及中文符号算两个字符,英文及英文符号算一个字符的实现

    /** * EditText字符数限制 * (中文及中文字符算两个字符,英文及英文字符算两个字符) */ public class EditTextLengthHelper { static Edit ...

  9. android限制输入字符的范围,Android EditText 对输入字数和内容范围进行限制

    在做定制机时,对光敏值进行范围控制时,以及对区号输入时遇到对输入字数以及输入内容的显示.找了好多方法,终于找到了几种方法其中EditText的addTextChangedListener功不可没.例如 ...

最新文章

  1. window tool
  2. 《机器学习项目开发实战》送书活动结果公布
  3. iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化
  4. 线性表之简介及顺序表
  5. 阿里云mysql写入性能_如何评价阿里云新一代关系型数据库 PolarDB?
  6. 大型网站限流算法的实现和改造
  7. 谷歌浏览器如何正确离线网页
  8. jenkins教程菜鸟_Jenkins教程:在Windows平台安装Jenkins
  9. pycharm连接SqlServer数据库
  10. Jack Lin tools 3Dmax批渲染插件
  11. extends和implement的区别
  12. 清华大学杨殿阁 深度解读《汽车数据安全管理若干规定(征求意见稿)》
  13. WPS 从今以后我再也不会用了 记录一下!
  14. OpenHarmony在Amlogic A311D芯片平台的快速开发上手指南
  15. 【Pandas入门教程】如何重塑表格布局
  16. 从“上云”到“云管理”,中国首个多云管理平台评估标准有何妙处?
  17. Unity模糊远处物体,近处清晰,景深效果
  18. 2021-05-23:打开Office后界面上显示一个横幅提示:你的许可证不是正版,并且你可能是盗版软件的受害者
  19. 读《互联网创业密码》之感想
  20. MySQL查询当前时间的前几天的数据

热门文章

  1. python中seq是什么_python seq
  2. Seq2Seq的PyTorch实现
  3. redis5集群安装并设置密码
  4. 如何分析虚拟机系列(1):新手篇VMProtect 1.81 Demo
  5. 3C认证所需要的条件和流程
  6. 电子显微镜的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. Pygame小游戏别踩钢琴块
  8. 无线服务器主机名是,wifi默认服务器主机名
  9. GDB调试工具基本命令总结
  10. 双环形图表_(双圆环图表)如何用excel制作多层圆环对比图