Переопределить кнопку удаления на Android?

Я в основном исправил проблему с этими строками в dispatchKeyEvent:

byte[] cmdLeft = { (byte) 27, (byte) '[', (byte) 'D' }; byte[] cmdErase = { (byte) 27, (byte) '[', (byte) 'P' }; mSession.appendToEmulator(cmdLeft, 0, cmdLeft.length); mSession.appendToEmulator(cmdErase, 0, cmdErase.length); 

Единственная проблема теперь в том, что если я выберу editText и удалю delete, один символ будет удален, но два будут отображаться на экране. Поэтому, если я напишу enable и удалю delete, он изменится на enab, но то, что на самом деле будет отправлено, – enabl

Я перепробовал рассылкуKeyEvent, и это вроде как работает. Если выбран параметр editText, терминал теперь удаляет символы через последовательный порт, поэтому это хороший шаг. Однако основная проблема по-прежнему заключается в том, что, если терминал выбран сам, на экран вместо текстового символа записываются странные маленькие квадратики. Хорошо написано, и если я продолжаю нажимать delete, он остается в одной коробке, но в следующий раз я набираю количество удалений, которые я нажал, появляется как коробки. Это очень странно …

Это похоже на то, что он просто переопределяется для edittext, а не для терминала.

Странные коробочки во всей красе:

Введите описание изображения здесь

 public boolean dispatchKeyEvent(KeyEvent event) { if (event != null && event.getAction() == KeyEvent.ACTION_UP) { return false; } if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) { try { sendOverSerial("\b".getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return super.dispatchKeyEvent(event); }; 

Я подключаюсь к эмулятору терминала, используя библиотеку в android, это подключается к последовательному устройству (коммутатору) и показывает мне отправленные / полученные данные. Я отправляю данные по соединению через текстовое поле под терминалом или вводя сам терминал и нажимая на клавиатуре в обоих случаях. Это будет только когда-либо используемая мягкая клавиатура. Если я отправляю неверную строку, я не могу восстановить ее из-за отсутствия реализации ключа удаления. Backspace в моем editTxt отлично работает, я просто хочу, чтобы он работал, когда терминал выделен, и я пишу в этом.

На данный момент, если я нажму кнопку «Удалить», появится несколько нечетных символов, и ничего больше не произойдет, я получаю исключение в журнале несколько раз ( http://i.imgur.com/wMRaLPX.png ). Я хочу знать, как мне изменить функциональность клавиш удаления, чтобы при нажатии на нее я могу отправить символ удаления, как это, но также сохранить возможность удалять символы в поле edittext и т. Д.

 sendOverSerial("\b".getBytes("UTF-8")) 

Это отправляет правильное обратное пространство, мне просто нужно его включить.

Но мягкая клавиатура, похоже, не регистрирует нажатия клавиш? Я продолжаю получать код ключа 0, и только ввод будет работать.

В настоящее время я тестирую https://stackoverflow.com/questions/4…62035_11377462 , но любые другие предложения были бы замечательными, поскольку около 10 предложений пока не сработали. Мое backspace не будет связано с editText, но с представлением терминала. Я даже не могу определить нажатие клавиши удаления.

Похоже, что используемый вами контроль терминала должен потреблять KEYCODE_DEL, а не позволять ему распространяться в окне, и он должен отправлять другой символ на удаленный конец вместо \ b. Поэтому, когда ваш текст редактирования сфокусирован, ваш dispatchKeyEvent обрабатывает прессу, но вы не видите его, когда терминал имеет фокус. Вы подтвердили, что четный обработчик запускается через отладчик, когда терминал имеет фокус? Вы не сказали, какую библиотеку вы используете для терминала, но я бы посмотрел на это и посмотрел, можете ли вы установить обработчик ключей или что-то в этом роде.

У меня нет опыта работы с Android, и я также признаю, что я никогда не пытался реализовать связывание ключей delete / backspace. Однако, если бы я пытался это сделать, и я не знал хорошей стандартной реализации, я мог бы подумать об обходном пути, который, вероятно, будет работать нормально. Сделайте привязку ключа для удаления с помощью связанного с ним прослушивателя действий. Извлеките прослушиватель действий getText () из текстового поля и сохраните его как строку. Подстройте эту строку, чтобы включить все, кроме последнего символа. Затем используйте setText () для текстового поля с новой строкой. Вид ручного способа сделать это, но это определенно сработает.

Я рекомендую захватить полную строку и отправить ее сразу, когда пользователь нажимает « Отправить» , как чат-программа.

Решение заключалось в том, чтобы переместить метод, который писал на экран другому классу, тогда все работало нормально.