美文网首页Android开发安卓开发Android开发经验谈
实现4个数字一组分隔显示的数字输入框

实现4个数字一组分隔显示的数字输入框

作者: 奔跑的佩恩 | 来源:发表于2018-07-25 09:35 被阅读27次

    前言

    很悲剧,对于输入框而言,有时我们不得不实现几个数字后就出现一个空格的情况,这是为了方便用户观察。那么今天就讲讲这中输入框CrEditText的实现吧。

    今天涉及内容:

    1. 原理分析
    2. CrEditText代码
    3. CrEditText布局及使用
    4. 效果图
    一.原理分析

    鉴于要实现四字分隔的情况,那么就需要监听 editText 的输入过程,即需要实现 TextWatcher 接口,然后在监听输入过程中去改变需要显示的内容。

    二.下面贴出CrEditText代码

    CrEditText继承于 EditText,实现 TextWatcher 接口

    package com.android.testdemo.main;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.text.Editable;
    import android.text.InputFilter;
    import android.text.InputType;
    import android.text.TextWatcher;
    import android.util.AttributeSet;
    import android.widget.EditText;
    
    import com.android.testdemo.base.StringUtil;
    
    import java.lang.reflect.Field;
    
    /**
     * Title:实现四个数字一组分隔的输入框
     * Description:
     * <p>
     * Created by pei
     * Date: 2018/7/24
     */
    @SuppressLint("AppCompatCustomView")
    public class CrEditText extends EditText{
    
        public CrEditText(Context context) {
            super(context);
            setEditText();
        }
    
        public CrEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
            setEditText();
        }
    
        public CrEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            setEditText();
        }
    
        public CrEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            setEditText();
        }
    
        private void setEditText(){
            setInputType(InputType.TYPE_CLASS_NUMBER);
            addTextChangedListener(new CardWatcher(CrEditText.this));
        }
    
        /**获取未经分隔的内容**/
        public String getDifferString(){
            String str=CrEditText.this.getText().toString();
            if(StringUtil.isNotEmpty(str)){
                String temp=str.replaceAll(" ", "");
                if(StringUtil.isNotEmpty(temp)){
                    return temp;
                }
            }
            return "";
        }
    
        class CardWatcher implements TextWatcher {
    
            private EditText mEditText;
    
            private String mNewText;
    
            public CardWatcher(EditText EditText) {
                mEditText = 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) {
                String newText = "";
                String temp = charSequence.toString();
                temp = temp.replace(" ", "");
                //每4位增加一个空格
                for (int j = 0; j < temp.length(); j++) {
                    newText = newText + temp.subSequence(j, j + 1);
                    if ((j + 1) % 4 == 0 && newText.length() < getMaxLength(mEditText)) {
                        newText = newText + " ";
                    }
                }
    
                if (mNewText == null || !newText.equals(mNewText)) {
                    mNewText = newText;
                    mEditText.setText(newText);
                    mEditText.setSelection(newText.length());
                }
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        }
    
        /**
         * 得到EditText最大长度
         *
         * @param view EditText
         * @return 最大长度
         */
        private int getMaxLength(EditText view) {
            int length = 0;
            try {
                InputFilter[] inputFilters = view.getFilters();
                for (InputFilter filter : inputFilters) {
                    Class<?> c = filter.getClass();
                    if (c.getName().equals("android.text.InputFilter$LengthFilter")) {
                        Field[] f = c.getDeclaredFields();
                        for (Field field : f) {
                            if (field.getName().equals("mMax")) {
                                field.setAccessible(true);
                                length = (Integer) field.get(filter);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return length;
        }
    
    }
    

    三.CrEditText布局及使用

    在activity的xml中的布局,你可以这样写:

        <com.android.testdemo.main.CrEditText
            android:id="@+id/edt_ein"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:textSize="14sp"
            android:gravity="center_vertical|right"
            android:background="@null"
            android:textColorHint="#ff0000"
            android:maxLength="19"
            android:textColor="#000000"
            android:hint="请填写纳税人识别号"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button1" />
    

    其中最为重要的是,你一定要设置 “android:maxLength="19"”属性,不然会没有效果。
    由于CrEditText是4数一组,那么直接 getText().toString() 是获取不到你输入的内容的,要想获得你输入的内容,你可以这样:

    String kk1=editText.getDifferString();
    
    四.效果图
    1.gif

    ok,今天的内容就讲到这里啦。

    相关文章

      网友评论

        本文标题:实现4个数字一组分隔显示的数字输入框

        本文链接:https://www.haomeiwen.com/subject/tdwumftx.html