2016-01-12 2 views
0

Мне нужно ввести только четные числа от 0 до 20 в EditText. Однако, когда я нажимаю клавиши «1» и «2», чтобы дать 12, это дает мне Toast, что мой ввод недействителен, прежде чем я получу нажать клавишу «2».Как разрешить только четные числа в EditText в TextWatcher?

Textwatcher:

public void afterTextChanged(Editable s) { 
    try { 
    int val = Integer.parseInt(s.toString()); 
    if (val > 20) { 
     s.replace(0, s.length(), "20", 0, 2); 
    } else if (val < 0) { 
     s.replace(0, s.length(), "0", 0, 1); 
    } else if (val == 1) { 
     s.replace(0, s.length(), "1", 0, 2); 
    } else if (val == 3) { 
     s.replace(0, s.length(), "3", 0, 2); 
    } else if (val == 5) { 
     s.replace(0, s.length(), "5", 0, 2); 
    } else if (val == 7) { 
     s.replace(0, s.length(), "7", 0, 2); 
    } else if (val == 9) { 
     s.replace(0, s.length(), "9", 0, 2); 
    } else if (val == 11) { 
     s.replace(0, s.length(), "11", 0, 2); 
    } else if (val == 13) { 
     s.replace(0, s.length(), "13", 0, 2); 
    } else if (val == 15) { 
     s.replace(0, s.length(), "15", 0, 2); 
    } else if (val == 17) { 
     s.replace(0, s.length(), "17", 0, 2); 
    } else if (val == 19) { 
     s.replace(0, s.length(), "19", 0, 2); 
    } 
    } catch (NumberFormatException ex) { 
    Toast.makeText(MainActivity.this,"invalid!",Toast.LENGTH_LONG).show(); 
    } 
} 
}); 
+1

Вместо тестирования входа на каждом символе пользователь вводит, было бы проще просто их ввести номер, а затем ударил представить чтобы отправить все значение в ваш нечетный/четный тест. Тогда вы могли бы просто сделать «if (val% 2 == 0) // значение val равно:' – NoChinDeluxe

+0

Где я должен добавить ваш код, потому что когда я добавил его, он остался прежним. –

ответ

1

Вы получите afterTextChanged вызов для почти каждого номер печати, так в настоящее время вы никогда не будете в состоянии написать 12.

Лучше всего было бы проверить его после того, как пользователь перейдет (потеряет фокус, другой элемент нажат) и предупредит их, если он не был правильно отформатирован.

Альтернативно, вы можете нажать runnable, чтобы проверить его, проехав несколько секунд.

Что касается изменений, то было бы легче сделать

public void postUpdateValidate(int val){ 
    if(val % 2 == 1){ //Checks to see if the remainder is 1 after dividing by 2 
     val++; 
    } 
    if(val > 20){ 
     val = 20; 
    } 
    if(val % 0){ 
     val = 0; 
    } 
    edittext.setText("" + val); 
} 
Смежные вопросы