2

我有一定的要求EditText在 Android 中制作一个需要月份和年份(所以我给出了 mm/yy 的提示)。当用户强制输入 2 位数字时,a/应该是可见的,比如(11/)后跟年份。

以下是我使用过的代码editext。但是,当我按下移动键盘上的十字按钮时,它不会删除/但会删除输入的月份。有人可以告诉我为什么会这样吗?

ed.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 s) {
        if(ed.getText().toString().matches("[0-9]") && ed.getText().toString().length()==2)  {
             month=ed.getText().toString();
            ed.setText(month+"/");  
        }
    }
});
4

3 回答 3

2

对于您想要实现的目标,请尝试以下我已经测试过的

将这两行添加到您的 xml 中的 edittext

android:maxLength="7"
android:inputType="number"

在您的活动中添加以下内容

public int pos=0; //declare this as global variable

ed=(EditText)findViewById(R.id.editText1);
ed.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

            if(ed.getText().length()==2 && pos!=3)
            {   ed.setText(ed.getText().toString()+"/");
                ed.setSelection(3);
            }

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
            pos=ed.getText().length();
        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub

        }
    });

此处编辑文本将仅采用数字且长度不超过 7,当输入第二个数字/附加到它时

当您在位置 3 即 / 之后并按下后退键时的 pos 变量位于 2 因此它再次附加 / 以避免此 pos 记录文本更改之前的 pos 所以当前一个位置为 3 之前您按下后退键它不会追加 / 导致删除 /

于 2013-05-27T11:16:20.987 回答
0

除了更改文本之外,您可能还需要移动控件中的选择位置。

于 2013-05-27T10:26:58.557 回答
0

试试下面的代码。它会为你工作!

在 xml 文件中:

 <EditText
                    android:id="@+id/mDateEntryField"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textSize="12sp"
                    android:inputType="date"
                    android:maxLength="5"
                    android:hint="Exp. MM/YY"/>

在 Java 文件中:

mDateEntryField.addTextChangedListener(mDateEntryWatcher);

private TextWatcher mDateEntryWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String working = s.toString();
            boolean isValid = true;
            mDateEntryField.setError(null);
            if (working.length() == 2 && before == 0) {
                if (Integer.parseInt(working) < 1 || Integer.parseInt(working) > 12) {
                    isValid = false;
                } else {
                    working += "/";
                    mDateEntryField.setText(working);
                    mDateEntryField.setSelection(working.length());
                }
            } else if (working.length() == 5 && before == 0) {
                String enteredYear = working.substring(3);

                DateFormat df = new SimpleDateFormat("yy"); // Just the year, with 2 digits
                String formattedDate = df.format(Calendar.getInstance().getTime());
                int currentYear = Integer.parseInt(formattedDate);
                if (Integer.parseInt(enteredYear) < currentYear) {
                    isValid = false;
                }
            } else if (working.length() != 5) {
                isValid = false;
            } else
                isValid = true;

            if (!isValid) {
                mDateEntryField.setError("Enter a valid date: MM/YY");
            } else {
                mDateEntryField.setError(null);
            }

        }

        @Override
        public void afterTextChanged(Editable s) {
        }

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

    };
于 2019-06-21T09:40:30.760 回答