TextWatcher делает стирание не работает правильно - PullRequest
0 голосов
/ 03 марта 2020

Мне нужна помощь

В основном у меня есть EditTexts в моем приложении, где пользователь может ввести дату,

И я использую текстовый наблюдатель для принудительного использования формата ДД / ММ / ГГГГ ,

Он также автоматически устанавливает текстовое представление как текущую дату,

Проблема возникает, когда, скажем, дата 20/10/2019, и я хочу изменить только день или месяц (20 и 10), так что происходит, когда я выбираю 10 (или в основном где-нибудь в тексте) и пытаюсь стереть скачки дробилки до конца строки и начинает стирать с года

вот код для текстового наблюдателя

   TextWatcher DateWatcher=new TextWatcher() {

            @Override

            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @SuppressLint("DefaultLocale")

            @TargetApi(Build.VERSION_CODES.N)

            @Override

            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @TargetApi(Build.VERSION_CODES.N)

            @SuppressLint("DefaultLocale")

            @Override

            public void afterTextChanged(Editable s) {

                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++;
                    }

                    if (clean.equals(cleanC)) sel--;

                    if (clean.length() < 8) {

                        clean=clean + ddmmyyyy.substring(clean.length());
                    } else {
                        int day=Integer.parseInt(clean.substring(0, 2));

                        int mon=Integer.parseInt(clean.substring(2, 4));

                        int year=Integer.parseInt(clean.substring(4, 8));

                        mon=mon < 1 ? 1 : mon > 12 ? 12 : mon;

                        cal.set(Calendar.MONTH, mon - 1);

                        year=(year < 1900) ? 1900 : (year > 2100) ? 2100 : year;

                        cal.set(Calendar.YEAR, year);

                        day=(day > cal.getActualMaximum(Calendar.DATE)) ? cal.getActualMaximum(Calendar.DATE) : day;

                        clean=String.format("%02d%02d%02d", day, mon, year);

                    }

                    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;

                    startdate.setText(current);

                    startdate.setSelection(sel < current.length() ? sel : current.length());

                }

            }

            private String current="";

            private String ddmmyyyy="DDMMYYYY";

            private Calendar cal=Calendar.getInstance();

        };
...