EditText удалить ключ не регистрируется при первом нажатии - PullRequest
2 голосов
/ 11 мая 2011

Моя проблема заключается в следующем;

У меня есть текст для редактирования, и я использую setKeyListener и создаю новый NumberKeyListener.В этом случае при нажатии клавиши при нажатии на число оно работает, как и ожидалось, но когда нажата кнопка удаления / возврата, оно не регистрируется при первых попытках X, но при X + 1 оно будет, где X - это число, другихключи, которые я нажал.Например, если я ввел 5, затем 6, затем 7, мой текст редактирования будет показывать 567, если я нажму «Удалить», ничего не произойдет, ударит его дважды, все еще ничего, при 4-м попадании он окончательно удалит 7 и будет 56.Это очень странно, потому что у меня есть запись журнала в обратном вызове keydown, и кажется, что он даже не запускается на первых 3 нажатиях?

Любые предложения приветствуются.

ОБНОВЛЕНИЕ: Я заметил, что если я щелкну по тексту редактирования и вернусь к нему, мои удаления будут регистрироваться при первом нажатии.Есть ли какой-нибудь буфер нажатия клавиш, связанный с правками редактирования, который необходимо очистить или что-то в этом роде?

 myedittext.setKeyListener(new NumberKeyListener() {        
       @Override
       public int getInputType() {
           return InputType.TYPE_CLASS_NUMBER;
       }

       @Override
       public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
           if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
               //logic here
           } else if (keyCode == KeyEvent.KEYCODE_DEL) {
               Log.i("DEBUG","delete key hit");
               //more logic here
           }
           Log.i("DEBUG","key was pressed");
           update();
           return true;
       }

       @Override
       protected char[] getAcceptedChars() {
           return new char[]{'0','1','2','3','4','5','6','7','8','9'};
       }
   });

С помощью приведенного выше кода я удалил всю свою логику и update() вызовы из кейлистов, все это, это просто распечатка журналов, и я вижу то же поведение, что он, похоже, не распознает первые x нажатий на удаление.

Ответы [ 2 ]

1 голос
/ 17 января 2014

Обратите внимание, что нет гарантии получения ключевых событий, включая KEYCODE_DEL, , если только не переопределяет onCreateInputConnection () в вашем представлении, а затем возвращает TYPE_NULL для вызывающего IME как вашего InputType. Пример можно найти здесь:

Android - не удается захватить клавишу возврата / удалить нажатие в программном обеспечении. клавиатура

Однако , я бы не использовал бы ключевые события вообще, если вы переопределяете EditText, потому что EditText уже напрямую поддерживает ваши цели, предоставляя средство InputFilter:

myEditText.setFilters(new InputFilter[]{
  //Filter this so that it removes everything that is not a digit.
  new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start,
                               int end, Spanned dest, int dstart, int dend) {
      //This is filtering ONE character at a TIME, as the user types them.
      String sourceString = source.toString();
      String sourceStringDigits = sourceString.replaceAll("[^0123456789]", "");
      return sourceStringDigits;
    }
  }
};

Вышеприведенное должно фильтровать ваш текст, не мешая обработке клавиши возврата (удаления), которая обрабатывается самим EditText.

0 голосов
/ 11 мая 2011

NumberKeyListener расширяется BaseKeyListener

Вы пытались переопределить backspace()?

http://developer.android.com/reference/android/text/method/BaseKeyListener.html#backspace%28android.view.View,%20android.text.Editable,%20int,%20android.view.KeyEvent%29

Выполняет действие, которое происходит при нажатии клавиши KEYCODE_DEL в TextView. Если есть выбор, удаляет выбор; в противном случае удаляет символ перед курсором, если он есть; ALT + DEL удаляет все в строке, на которой находится курсор. Возвращает

true if anything was deleted; false otherwise. 

Убедитесь, что вы звоните super.basckspace();, чтобы вести себя правильно.


У меня нет доступа к SDK, чтобы проверить его, но добавьте его в свой слушатель:

@Override
boolean backspace(View view, Editable content, int keyCode, KeyEvent event) {
    Log.d("NumberKeyListener","backspace() called");
    return super.backspace();
}

Исходя из того, что я понимаю в отношении формулировок и кода BaseKeyListener.java, это обратный вызов, который реагирует на нажатие клавиши удаления.

...