Переопределить кнопку удаления на 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
Я перепробовал dispatchKeyEvent, и это вроде как работает. Если выбран editText, терминал удаляет символы через последовательный порт, поэтому это хороший шаг. Однако основная проблема по-прежнему заключается в том, что, если терминал выбран сам, на экран вместо текстового символа записываются странные маленькие прямоугольники. Хорошо написано, и если я продолжаю нажимать delete, он остается в этом окне, но в следующий раз я набираю количество удалений, которые я нажал, появляется как коробки. Это очень странно...
Он вроде бы просто переопределяется для edittext, а не для терминала.
Странные маленькие коробки во всей их славе:
![Enter image description here]()
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, и только ввод будет работать.
В настоящее время я тестирую qaru.site/info/13969/..., но любые другие предложения были бы замечательными, так как до сих пор не было сделано 10 предложений. Мое backspace не будет связано с editText, но с представлением терминала. Я даже не могу обнаружить нажатие клавиши удаления.
Ответы
Ответ 1
Похоже, что используемый вами управляющий терминал должен потреблять KEYCODE_DEL вместо того, чтобы позволить ему распространяться в окне, и он должен посылать другой char на удаленный конец вместо \b. Поэтому, когда ваш текст редактирования сфокусирован, ваш dispatchKeyEvent обрабатывает прессу, но вы не видите его, когда терминал имеет фокус. Вы подтвердили, что четный обработчик запускается через отладчик, когда терминал имеет фокус? Вы не сказали, какую библиотеку вы используете для терминала, но я бы посмотрел на это и посмотрел, можете ли вы установить обработчик ключа или что-то еще.
Ответ 2
У меня нет опыта работы с Android, и я также признаю, что я никогда не пытался реализовать привязку ключа delete/backspace. Однако, если бы я пытался это сделать, и я не знал хорошей стандартной реализации, я мог бы подумать об обходном пути, который, вероятно, будет работать нормально. Создайте привязку ключа для удаления с помощью связанного с ним прослушивателя действий. Извлеките прослушиватель действий getText() из текстового поля и сохраните его как строку. Подстройте эту строку, чтобы включить все, кроме последнего символа. Затем используйте setText() для текстового поля с новой строкой. Вид ручного способа сделать это, но это определенно сработает.
Ответ 3
Я рекомендую захватить полную строку и отправить ее сразу, когда пользователь нажимает Send, как чат-программа.
Ответ 4
Решение заключалось в том, чтобы переместить метод, который писал на экран другому классу, тогда все работало нормально.