Android Edittext限制输入小数位数,限制输入数字大小及所有相关式样与属性(总结)

对于Edittext大家都是不陌生的,在这里就不多说什么了,直接进入主题,写此篇只是为了记录一下Edittext的一些使用技巧:

Edittext属性大全

1.限制输入范围方法一:

/**
 * 限制输入数字的范围
 */
public class RegionNumberEditText extends EditText {
    private Context context;
    private int max;
    private int min;

    public RegionNumberEditText(Context context) {
        super(context);
        this.context = context;
    }

    public RegionNumberEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public RegionNumberEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
    }

    /**
     * 设置输入数字的范围
     * @param maxNum 最大数
     * @param minNum 最小数
     */
    public void setRegion(int maxNum, int minNum) {
        setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
        this.max = maxNum;
        this.min = minNum;
    }

    public void setTextWatcher() {
        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) {
                if (start >= 0) {//从一输入就开始判断,
                    if (min != -1 && max != -1) {
                        try {
                            int num = Integer.parseInt(s.toString());
                            //判断当前edittext中的数字(可能一开始Edittext中有数字)是否大于max
                            if (num > max) {
                                s = String.valueOf(max);//如果大于max,则内容为max
                                setText(s);
                                Prompt.showTips(context, "金额不能超过" + max + "元");

                            } else if (num < min) {
                                s = String.valueOf(min);//如果小于min,则内容为min
                            }
                        } catch (NumberFormatException e) {
                            LFLog.e("ontextchanged", "==" + e.toString());
                        }
                        //edittext中的数字在max和min之间,则不做处理,正常显示即可。
                        return;
                    }
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }
}

调用:

RegionNumberEditText edittext=new RegionNumberEditText(this); 
edittext.setRegion(100,0); 
edittext.setTextWatcher();

2.限制输入范围方法二:

public class EditInputFilter implements InputFilter{ 
		/**
		 * 最大数字
		 */
		public static final int MAX_VALUE = 10000;
		/**
		 * 小数点后的数字的位数
		 */
		public static final int PONTINT_LENGTH = 2;
		Pattern p;
		public EditInputFilter(){   
			p = Pattern.compile("[0-9]*");   //除数字外的其他的
		}   
 
		/**
		 *  source    新输入的字符串   
		 *  start    新输入的字符串起始下标,一般为0    
		 *  end    新输入的字符串终点下标,一般为source长度-1    
		 *  dest    输入之前文本框内容    
		 *  dstart    原内容起始坐标,一般为0    
		 *  dend    原内容终点坐标,一般为dest长度-1
		 */
 
		@Override  
		public CharSequence filter(CharSequence src, int start, int end,   
				Spanned dest, int dstart, int dend) {   
			String oldtext =  dest.toString();
			System.out.println(oldtext);
			//验证删除等按键
			if ("".equals(src.toString())) {   
				return null;
			}
			//验证非数字或者小数点的情况
			Matcher m = p.matcher(src); 
			if(oldtext.contains(".")){
				//已经存在小数点的情况下,只能输入数字
				if(!m.matches()){
					return null;
				}
			}else{
				//未输入小数点的情况下,可以输入小数点和数字
				if(!m.matches() && !src.equals(".") ){
					return null;
				} 
			}
			//验证输入金额的大小
			if(!src.toString().equals("")){
				double dold = Double.parseDouble(oldtext+src.toString());
				if(dold > MAX_VALUE){
					CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
					return dest.subSequence(dstart, dend);
				}else if(dold == MAX_VALUE){
					if(src.toString().equals(".")){
						CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
						return dest.subSequence(dstart, dend);
					}
				}
			}
			//验证小数位精度是否正确
			if(oldtext.contains(".")){
				int index = oldtext.indexOf(".");
				int len = dend - index;	
				//小数位只能2位
				if(len > PONTINT_LENGTH){
					CharSequence newText = dest.subSequence(dstart, dend);
					return newText;
				}
			}
			return dest.subSequence(dstart, dend) +src.toString();
		}   
	}

调用:


InputFilter[] filters = { new EditInputFilter() };  
edit.setFilters(filters);

3.限制输入范围方法三(我用到的一种方法):

/**
     * 设置小数后位数控制
     */
    private InputFilter lendFilter = new InputFilter() {
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            // 删除等特殊字符,直接返回
            if ("".equals(source.toString())) {
                return null;
            }
            String dValue = dest.toString();
            String[] splitArray = dValue.split("\\.");
            if (splitArray.length > 1) {
                String dotValue = splitArray[1];
                int diff = dotValue.length() + 1 - 4;//4表示输入框的小数位数
                if (diff > 0) {
                    return source.subSequence(start, end - diff);
                }
            }
            return null;
        }
    };

调用:

et_lend_maximum_number.setFilters(new InputFilter[]{lendFilter});

下面是类似的使用:

a.EditText的属性中加上:

android:inputType="numberDecimal"
/** 输入框小数的位数*/
	private static final int DECIMAL_DIGITS = 1; 
	
/**
	 *  设置小数位数控制   
	 */
    InputFilter lengthfilter = new InputFilter() {   
        public CharSequence filter(CharSequence source, int start, int end,   
                Spanned dest, int dstart, int dend) {   
            // 删除等特殊字符,直接返回   
            if ("".equals(source.toString())) {   
                return null;   
            }   
            String dValue = dest.toString();   
            String[] splitArray = dValue.split("\\.");   
            if (splitArray.length > 1) {   
                String dotValue = splitArray[1];   
                int diff = dotValue.length() + 1 - DECIMAL_DIGITS;   
                if (diff > 0) {   
                    return source.subSequence(start, end - diff);   
                }   
            }   
            return null;   
        }   
    };  

mEt.addTextChangedListener(mTextWatcher);
// 控制输入框的小数位和长度,这里长度暂时设置为10
mEt.setFilters(new InputFilter[] { lengthfilter, new InputFilter.LengthFilter(10) }); 

还可以这样写:

 //设置输入框允许输入的类型(正则)
    //对应的布局属性是--->android:digits="0123456789."
    setKeyListener(DigitsKeyListener.getInstance("0123456789."));
    //设置输入字符
    setFilters(new InputFilter[]{inputFilter});
    addTextChangedListener(this);

4.通过布局属性来控制:

maxLength、inputType、minLength、digits等

a.设置EditText的android:digits 属性, 这种方式可以指出要支持的字符。比如要限制只能输入数字和字母,可以这样:

android:digits="0123456789abcdefghijklmnopqrstuvwxyz"。 PS:吐槽一下,写着好累,不支持区间操作符~或-

b.顺便说说inputType属性:

<EditText
    //电话号码
    android:inputType="phone" 
    //文本类型,多为大写、小写和数字符号。 
    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="datetime" //时间日期 
    android:inputType="date" //日期键盘 
    android:inputType="time" //时间键盘
    />

c.imeOptions属性

当我们手机横屏,且使用Android自带的软键盘为EditText进行文本输入时,若不进行特殊的设置,该软键盘会占用整个界面,那么,如何让键盘只占用屏幕的一部分呢? 其实只需要改一个小小的属性即可!

<EditText 
    android:id="@+id/text1" 
    android:imeOptions="flagNoExtractUi"/>

另外使用android:imeOptinos可对Android自带的软键盘进行一些界面上的设置:

android:imeOptions="flagNoExtractUi"  //使软键盘不全屏显示,只占用一部分屏幕
同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键
android:imeOptions="actionNone"  //输入框右侧不带任何提示
android:imeOptions="actionGo"    //右下角按键内容为'开始'
android:imeOptions="actionSearch"  //右下角按键为放大镜图片,搜索
android:imeOptions="actionSend"    //右下角按键内容为'发送'
android:imeOptions="actionNext"   //右下角按键内容为'下一步'
android:imeOptions="actionDone"  //右下角按键内容为'完成'

同时,可能EditText添加相应的监听器,捕捉用户点击了软键盘右下角按钮的监听事件,以便进行处理。

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    Toast.makeText(MainActivity.this, "text2", Toast.LENGTH_SHORT).show();
    return false;
	}
});

5.EditText在XML布局中设置inputType后hint字体会改变,如下图:

由于手机号码和验证码输入的都是整数,inputType为number,而密码则是textPassword,做国际化的话,用英文显示字体是不同的,看着多了一点间距,而中文是相同的,下面是两个属性:

android:inputType="textPassword"
android:inputType="number"

接下来我们来看看怎么解决:

a.第一种方法:在代码中加上这两行代码

EditText.setTypeface(Typeface.DEFAULT);
EditText.setTransformationMethod(new PasswordTransformationMethod());

第一种方法要注意一下,上面的代码只适合于隐藏的密码之类的,若是手机号码或验证码的话,必须不可以为......,所以可以用下面的代码:

 et_register_phone_num.setTypeface(Typeface.DEFAULT);
        et_register_phone_num.setTransformationMethod(new HideReturnsTransformationMethod());

b.第二种方法:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);

6.密码的显示隐藏:

  /**
     * 抽取CheckBox与EditTextd的使用赋值方法
     *
     * @param a
     * @param b
     */
    private void checkedChangeListener(CheckBox a, final EditText b) {
        a.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                                         boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked) {
                    //设置EditText文本为可见的
                    b.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                } else {
                    //设置EditText文本为隐藏的
                    b.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }
                b.postInvalidate();
                //切换后将EditText光标置于末尾
                CharSequence charSequence = b.getText();
                if (charSequence instanceof Spannable) {
                    Spannable spanText = (Spannable) charSequence;
                    Selection.setSelection(spanText, charSequence.length());
                }
            }
        });
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值