如何在Android的ContextChange Listener中验证DOB?

如何在Android的ContextChange Listener中验证DOB?,android,Android,我的要求是,当用户输入DOB(如2017年9月11日)时,如果用户删除了09,则在删除时,我们需要显示2017年9月11日,这同样适用于DD和YYYY。在点击编辑文本输入DOB之前,我需要填写字符的DD/MM/YYYY,如果任何内容被修改,我需要显示DD/MM/YYYY Below is the code: @Override public void beforeTextChanged(CharSequence s, int start, int count, int after

我的要求是,当用户输入DOB(如2017年9月11日)时,如果用户删除了09,则在删除时,我们需要显示2017年9月11日,这同样适用于DD和YYYY。在点击编辑文本输入DOB之前,我需要填写字符的DD/MM/YYYY,如果任何内容被修改,我需要显示DD/MM/YYYY

   Below is the  code:
@Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.i(TAG, "Start: "+start+"; before: "+before+"; count: "+count);
        if (!s.toString().equals(current)) {
            String clean = s.toString().replaceAll("[^\\d.]", "");
            String cleanC = current.replaceAll("[^\\d.]", "");

            int cl = clean.length();
            int sel = cl;
            for (int i = 2; i <= cl && i < 6; i += 2) {
                sel++;
            }
            //Fix for pressing delete next to a forward slash
            if (clean.equals(cleanC)) sel--;

            Log.i(TAG, "clean.length(): "+clean.length());
            Log.i(TAG, "cleanC.length(): "+cleanC.length());

//            if(clean.length() < cleanC.length()) {
//                if(start < (cleanC.length()+1)) {
//                    Log.i(TAG, "Back was pressed! in middle.. will clear ");
//                    clean = "";
//                }
//            }

            if (clean.length() < 8){
                clean = clean + inputFormat.substring(clean.length());
                dateEditText.setTag(null);
            }else{
                //This part makes sure that when we finish entering numbers
                //the date is correct, fixing it otherwise
                int day  = 0;
                int mon  = 0;
                int year = 0;

                try {
                    day = Integer.parseInt(clean.substring(0, 2));
                    mon = Integer.parseInt(clean.substring(2, 4));
                    year = Integer.parseInt(clean.substring(4, 8));


                    if(mon > 12) mon = 12;
                    cal.set(Calendar.MONTH, mon-1);
                    year = (year<minYear)?minYear:(year>maxYear)?maxYear:year;
                    cal.set(Calendar.YEAR, year);
                    // ^ first set year for the line below to work correctly
                    //with leap years - otherwise, date e.g. 29/02/2012
                    //would be automatically corrected to 28/02/2012

                    day = (day > cal.getActualMaximum(Calendar.DATE))? cal.getActualMaximum(Calendar.DATE):day;
                    clean = String.format("%02d%02d%02d", day, mon, year);

                    try {
                        dateEditText.setTag(sdf.parse(clean));
                    } catch (ParseException e) {
                        Log.e(TAG, "ParseException: "+e);
                        dateEditText.setTag(null);
                    }
                } catch (NumberFormatException e) {
                    Log.e(TAG, "Error: "+e);
                    Bugsnag.notify(e);

                    dateEditText.setTag(null);
                    dateEditText.setText("");
                    clean = inputFormat;
                }
            }

            clean = String.format("%s/%s/%s", clean.substring(0, 2),
                    clean.substring(2, 4),
                    clean.substring(4, 8));

            sel = sel < 0 ? 0 : sel;
            current = clean;
            dateEditText.setText(current);
            dateEditText.setSelection(sel < current.length() ? sel : current.length());

            Log.v(TAG, "current: " + current);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
下面是代码:
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
Log.i(标记“开始:“+Start+”,在“+before+”之前,计数:“+count”);
如果(!s.toString().等于(当前)){
字符串clean=s.toString().replaceAll(“[^\\d.]”,“”);
字符串cleanC=current.replaceAll(“[^\\d.]”,“”);
int cl=clean.length();
int sel=cl;
对于(inti=2;i12)mon=12;
校准设置(日历月,周一至一);
年份=(yearmaxYear)?maxYear:年份;
校准设置(日历年、年份);
//^下一行正常工作的第一个设置年份
//闰年-否则,日期为2012年2月29日
//将自动更正为2012年2月28日
day=(day>cal.getActualMaximum(Calendar.DATE))?cal.getActualMaximum(Calendar.DATE):天;
clean=String.format(“%02d%02d%02d”,日,月,年);
试一试{
setTag(sdf.parse(clean));
}捕获(解析异常){
Log.e(标记“ParseException:+e);
dateEditText.setTag(空);
}
}捕获(数字格式){
Log.e(标记“错误:+e”);
通知(e);
dateEditText.setTag(空);
dateEditText.setText(“”);
clean=输入格式;
}
}
clean=String.format(“%s/%s/%s”,clean.substring(0,2),
清洁。子串(2,4),
干净。子串(4,8));
sel=sel<0?0:sel;
电流=清洁;
dateEditText.setText(当前);
dateEditText.setSelection(sel
我试过上面的一个:但如果中间删除了任何字符,那么最后一个字符将在2018年10月11日前删除。如果我删除了9个字符,那么它将变为2011年9月11日,这是不正确的

如何在android中实现这一点?我所需要的是删除任何应该用DD/MM/YYYY填充的字符

   Below is the  code:
@Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Log.i(TAG, "Start: "+start+"; before: "+before+"; count: "+count);
        if (!s.toString().equals(current)) {
            String clean = s.toString().replaceAll("[^\\d.]", "");
            String cleanC = current.replaceAll("[^\\d.]", "");

            int cl = clean.length();
            int sel = cl;
            for (int i = 2; i <= cl && i < 6; i += 2) {
                sel++;
            }
            //Fix for pressing delete next to a forward slash
            if (clean.equals(cleanC)) sel--;

            Log.i(TAG, "clean.length(): "+clean.length());
            Log.i(TAG, "cleanC.length(): "+cleanC.length());

//            if(clean.length() < cleanC.length()) {
//                if(start < (cleanC.length()+1)) {
//                    Log.i(TAG, "Back was pressed! in middle.. will clear ");
//                    clean = "";
//                }
//            }

            if (clean.length() < 8){
                clean = clean + inputFormat.substring(clean.length());
                dateEditText.setTag(null);
            }else{
                //This part makes sure that when we finish entering numbers
                //the date is correct, fixing it otherwise
                int day  = 0;
                int mon  = 0;
                int year = 0;

                try {
                    day = Integer.parseInt(clean.substring(0, 2));
                    mon = Integer.parseInt(clean.substring(2, 4));
                    year = Integer.parseInt(clean.substring(4, 8));


                    if(mon > 12) mon = 12;
                    cal.set(Calendar.MONTH, mon-1);
                    year = (year<minYear)?minYear:(year>maxYear)?maxYear:year;
                    cal.set(Calendar.YEAR, year);
                    // ^ first set year for the line below to work correctly
                    //with leap years - otherwise, date e.g. 29/02/2012
                    //would be automatically corrected to 28/02/2012

                    day = (day > cal.getActualMaximum(Calendar.DATE))? cal.getActualMaximum(Calendar.DATE):day;
                    clean = String.format("%02d%02d%02d", day, mon, year);

                    try {
                        dateEditText.setTag(sdf.parse(clean));
                    } catch (ParseException e) {
                        Log.e(TAG, "ParseException: "+e);
                        dateEditText.setTag(null);
                    }
                } catch (NumberFormatException e) {
                    Log.e(TAG, "Error: "+e);
                    Bugsnag.notify(e);

                    dateEditText.setTag(null);
                    dateEditText.setText("");
                    clean = inputFormat;
                }
            }

            clean = String.format("%s/%s/%s", clean.substring(0, 2),
                    clean.substring(2, 4),
                    clean.substring(4, 8));

            sel = sel < 0 ? 0 : sel;
            current = clean;
            dateEditText.setText(current);
            dateEditText.setSelection(sel < current.length() ? sel : current.length());

            Log.v(TAG, "current: " + current);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

非常感谢您的帮助,

有人能建议是否有图书馆可满足上述要求吗?有人能建议是否有图书馆可满足上述要求吗?