Android: управление мягкой клавиатурой по желанию HTC

Мне нужна цифровая клавиатура, в которой была кнопка go или done, которая закрывала и выполняла класс вычислений. Благодаря подсказке от commonware, с чего начать, я получил эту работу прекрасно на эмуляторе. Затем я пришел, чтобы загрузить его на мое желание HTC тестировать, и он не работает вообще. Я уверен, что это должно быть из-за того, что HTC имеет собственный ime, но наверняка должен быть способ сделать эту работу на телефонах HTC? Кому-нибудь еще удалось обойти эту проблему?

Я могу воспроизвести то, что, как я думаю, вы видите на HTC Incredible.

Не все мягкие клавиатуры будут поддерживать кнопку действия IME. Некоторые, например, «мягкая» клавиатура Graffiti, могут не иметь никаких кнопок, не говоря уже о кнопке действия IME. Даже в документе определения совместимости ничего не говорится о требовании такой кнопки действий для клавиатур, поставляемых с устройством.

Следовательно, вы не должны полагаться на кнопку действия IME. Если он есть, пользователи могут его использовать. Тем не менее, всегда есть другие способы достижения своей цели.

Я обнаруживаю, была ли нажата кнопка DONE / GO / RETURN с помощью onEditorActionListener, но проверка параметров IME и KeyEvents для покрытия клавиатур HTC, а также любых клавиатур, принимающих параметры IME.

(Этот код работает для клавиатур HTC Incredible, а также любой клавиатуры с параметрами IME)

 EditText.setOnEditorActionListener(new TextView.OnEditorActionListener(){ public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event){ if(actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ //Do something in here return true; } else { return false; } } }); 

Я использовал EditText с inputType = "number" и решил проблему, изменив решение Asha:

 private TextView.OnEditorActionListener numberEnterListener = new TextView.OnEditorActionListener(){ public boolean onEditorAction(TextView tv, int actionId, KeyEvent event){ if(actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ tv.clearFocus(); //Stupid keyboard needs to be closed as well InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(tv.getWindowToken(), 0); return true; } else { return false; } } }; 

Фокус был удален, чтобы остановить показ цифровой клавиатуры. Иммер был необходим, потому что мягкая клавиатура все еще присутствовала даже после очистки фокуса.