Android TextWatcher.afterTextChanged по сравнению с TextWatcher.onTextChanged

strtol преобразует значение в long int, диапазон которого может отличаться от int. Кроме того, он возвращает LONG_MAX или LONG_MIN, если значение может быть преобразовано, но находится за пределами диапазона для long int. В этом случае для errno будет установлено значение ERANGE (но не иначе!) Кроме того, в случае сбоя сопоставления возвращаемое значение равно 0, но errno не установлено; но ep указывает на начало строки.

int isInt (char *s)
{
   char *ep = NULL;

   // zero errno first!
   errno = 0;
   long i = strtol (s, &ep, 10);
   if (errno) {
       return 0;
   }

   // matching failure.
   if (ep == s) {
       return 0;
   }

   // garbage follows
   if (! ((*ep == 0) || (!strcmp(ep,"\n")))) {
      return 0;
   }

   // it is outside the range of `int`
   if (i < INT_MIN || i > INT_MAX) {
      return 0;
   }

   return 1; 
} 

То, что dbush говорит об использовании perror, верно. strtol устанавливает ошибку только в случае переполнения long, что не является единственно возможным случаем сбоя в вашей функции, поэтому perror может напечатать что-нибудь вроде Is a directory или Multihop attempted.

113
задан Tim 5 June 2019 в 14:16
поделиться

1 ответ

общественность освобождает afterTextChanged (Доступный для редактирования s)

, Этот метод называют, чтобы уведомить Вас, что, где-нибудь в s, текст был изменен. Законно внести дальнейшие изменения в s от этого обратного вызова, но бояться вовлекать себя в бесконечный цикл, потому что любые изменения Вы составляете завещание, заставляют этот метод быть названным снова рекурсивно. (Вам не говорят, где изменение произошло, потому что другой afterTextChanged () методы, возможно, уже внес другие изменения и делал недействительным смещения. Но если необходимо знать здесь, можно использовать setSpan(Object, int, int, int) в onTextChanged(CharSequence, int, int, int), чтобы отметить место и затем искать отсюда, где промежуток закончился.

общественность освобождает beforeTextChanged (CharSequence s, международный запуск, международное количество, интервал после)

, Этот метод называют, чтобы уведомить Вас, что, в s, эти count символы, начинающиеся в start, собираются быть замененными новым текстом с длиной after. Это - ошибка попытаться внести изменения в s от этого обратного вызова.

общественность освобождает onTextChanged (CharSequence s, международный запуск, интервал прежде, международное количество)

, Этот метод называют, чтобы уведомить Вас, что, в s, эти count символы, начинающиеся в [1 111], только что заменили старый текст, который имел длину before. Это - ошибка попытаться внести изменения в [1 113] от этого обратного вызова.

прямо от [1 114] Ссылка Android для TextWatcher.

12
ответ дан Pang 24 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: