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

Posted 冰糖葫芦三剑客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());
                
            
        );
    

 

以上是关于Android Edittext限制输入小数位数,限制输入数字大小及所有相关式样与属性(总结)的主要内容,如果未能解决你的问题,请参考以下文章

EditText限制小数点前后位数

限定EditText小数位数

如何限制 EditText 输入只允许 3 位整数或小数

如何限制用户输入EditText(Xamarin.Android)中小数点分隔符后的最大2位或3位数?

EditText 设置最大小数位数

android EditText控件中, 如何判断并且限制只能输入数字?