有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在EditText的日期中添加了斜杠

我读了很多类似的问题,但没有人回答我的问题,也没有人能解决我的问题。 我在布局中有这样的编辑文本:

    <EditText
        安卓:id="@+id/editText2"
        安卓:layout_width="248dp"
        安卓:layout_height="59dp"
        安卓:layout_marginStart="21dp"
        安卓:layout_marginTop="36dp"
        安卓:width="360dp"
        安卓:ems="5"
        安卓:hint="@string/ultimos4Dig"
        安卓:inputType="number"
        安卓:maxLength="10"
        安卓:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

我需要的是,当用户写月份和年份的数字时,在他写的时候会出现或消失斜杠。如果他写了两个数字,那么需要出现斜杠。如果他删除了,并且只有一个数字,那么斜杠需要消失

我需要在编辑文本中显示日期:14/06

这是我的代码,但它不工作

  protected void onCreate(Bundle savedInstanceState) {

        EditText editText2 = (EditText)  findViewById(R.id.editText2);
        editText2.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            @Override
            public void afterTextChanged(Editable text) {
                if (text.length() == 2) {
                    text.append('/');
                }
            }
        });

仅供参考,我为解决这个问题上了一堂课,谢谢


共 (4) 个答案

  1. # 1 楼答案

    使用遮罩编辑文本:

    https://github.com/santalu/mask-edittext

    在Moudle build gradle中添加:

    allprojects {
        repositories {
            maven { url 'https://jitpack.io' }
        }
    }
    

    应用内构建渐变添加:

    dependencies {
         implementation 'com.github.santalu:maskara:1.0.0'
    }
    

    在布局中,您可以使用MaskEditText:

    <com.santalu.maskedittext.MaskEditText
        android:id="@+id/editText2"
        android:layout_width="248dp"
        android:layout_height="59dp"
        android:layout_marginStart="21dp"
        android:layout_marginTop="36dp"
        android:width="360dp"
        android:ems="5"
        android:hint="@string/ultimos4Dig"
        android:inputType="number"
        android:maxLength="10"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:mask="##/##"/>
    
  2. # 2 楼答案

    我认为这在某种程度上解决了问题。将app:endIconMode="clear_text"添加到TextInputlayout

     dateOfBirth.getEditText().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) {
                    if (charSequence.length() == 2 || charSequence.length() == 5) {
                        if (!Pattern.compile("([0-9]{2})/").matcher(charSequence).matches()) {
                            dateOfBirth.getEditText().setText(new StringBuilder(dateOfBirth.getEditText().getText().toString()).insert(charSequence.length(), "/").toString());
                            dateOfBirth.getEditText().setSelection(dateOfBirth.getEditText().getText().length());
                        }
                    }
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
    
                }
            });
    
    
  3. # 3 楼答案

    将逻辑添加到onTextChanged而不是afterTextChanged

    请尝试以下代码:

    editText2 .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) {
                    String str=editText2 .getText().toString();
                    int textLength=editText2 .getText().length();
                    if (textLength == 3) {
                        if (!str.contains("/")) {
                            editText2 .setText(new StringBuilder(editText2 .getText().toString()).insert(str.length() - 1, "/").toString());
                            editText2 .setSelection(editText2 .getText().length());
                        }
                    }
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            });
    

    我希望它对你有用

  4. # 4 楼答案

    谢谢你,几天后我得到了解决方案,这门课:

    public class EditMMYY extends AppCompatEditText implements TextWatcher
    {
        private String sPrev = "";
        private int iMon = 0;
        private int iYear = 0;
    
        private void InitValue()
        {
            setInputType(InputType.TYPE_CLASS_NUMBER);
            setFilters(new InputFilter[] {new InputFilter.LengthFilter(5)});
            setHint("MM/YY");
        }
    
        public EditMMYY(Context context)
        {
            super(context);
            InitValue();
        }
    
        public EditMMYY(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            InitValue();
        }
    
        public EditMMYY(Context context, AttributeSet attrs, int defStyleAttr)
        {
            super(context, attrs, defStyleAttr);
            InitValue();
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            // Chequeo que el ingreso sea MM/YY
            String sNew = s.toString();
            int newLen = sNew.length();
    
            if(sNew.equals(sPrev))
            {
                return;
            }
            switch(newLen)
            {
                case 0:
                    iMon = 0;
                    iYear = 0;
                    sPrev = sNew;
                    break;
                case 1:
                    iMon  = Integer.parseInt(sNew);
                    iYear = 0;
                    if(sPrev.length() == 0 && iMon > 1)
                    {    // Si se escribe un número mayor que 1, lo tomo como mes
                        sPrev = String.format("%02d/", iMon);
                    }
                    else
                    {
                        sPrev = sNew;
                    }
                    break;
                case 2:
                    iMon  = Integer.parseInt(sNew);
                    iYear = 0;
                    if(sPrev.length() == 1)
                    {
                        // Si ya es un mes válido, lo completo, sino dejo
                        // sPrev sin cambios hasta que se ingrese algo válido
                        if(iMon >= 1 && iMon <= 12)
                        {
                            sPrev = String.format("%02d/", iMon);
                        }
                    }
                    else
                    {
                        sPrev = sNew;
                    }
                    break;
                case 3:
                    iMon  = Integer.parseInt(sNew.substring(0, 2));
                    iYear = 0;
                    if(sPrev.length() == 2)
                    {
                        iMon = Integer.parseInt(sNew.substring(0, 2));
                        iYear = Integer.parseInt(sNew.substring(2, 3));
                        sPrev = String.format("%02d/%d", iMon, iYear);
                    }
                    else
                    {
                        sPrev = sNew;
                    }
                    break;
                case 4:
                case 5:
                    iMon = Integer.parseInt(sNew.substring(0, 2));
                    iYear = Integer.parseInt(sNew.substring(3, newLen));
                    sPrev = sNew;
                    break;
                default:
                    sPrev = sNew;
                    break;
            }
            setText(sPrev);
            setSelection(sPrev.length());
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {
        }
    
        @Override
        public void afterTextChanged(Editable s)
        {
    
        }
    
        public int getMon()
        {
            return iMon;
        }
    
        public int getYear()
        {
            return iYear;
        }
    }