Предотвратить editText.setText, пока EditText модифицируется с помощью мягкой клавиатуры ввода

У меня есть EditText в моем приложении. Этот editText обновляется с помощью кода каждые 10 секунд с использованием метода editText.setText. Я хочу остановить это обновление, когда пользователь открывает программную клавиатуру. Когда пользователь завершает действие ввода (нажмите кнопку «Готово»), я хочу возобновить обновление из editText.setText. Я пробовал InputMethodManager isActive(View), чтобы проверить, активен ли мой EditText в настоящее время при использовании метода editText.setText. Это отлично работает, когда отображается клавиатура. Но когда пользователь нажимает кнопку «Готово» и программная клавиатура скрывается, isActive (View) по-прежнему дает значение true, и мой editText.setText не вызывается. Ниже приведен мой код, который обновляет editText каждые 10 секунд.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(!imm.isActive(editText)){
   editText.setText("10.2");
  }

Таким образом, этот imm.isActive (editText) возвращает true даже после того, как пользователь нажал кнопку «Готово» на программной клавиатуре. Пожалуйста, предложите любой способ сделать это.


person Abhijeet Duraphe    schedule 22.10.2013    source источник


Ответы (1)


Решение 1

Создайте логическую управляющую переменную isKeyboardVisible и установите для нее значение true, когда вы показываете клавиатуру, и false, когда вы ее скрываете. Проверьте его значение перед вызовом setText().

Решение 2

Альтернативным, несколько хакерским решением было бы заключить обе части, которые изменяют значение EditText, в блок synchronized. Таким образом, каждая часть будет ждать завершения другой перед выполнением.

Решение 3

Вы можете прослушивать события изменения фокуса EditText и реагировать на них. Они, как правило, совпадают с отображением/скрытием программной клавиатуры.

person Piovezan    schedule 22.10.2013
comment
Привет Piovezan, Спасибо за ваш ответ. - person Abhijeet Duraphe; 22.10.2013
comment
Без проблем. Если вас устраивает ответ, примите его, нажав на галочку слева от него. - person Piovezan; 22.10.2013
comment
Я пробовал решение 1, однако есть хитрые способы узнать видимость клавиатуры. Во многих темах предлагалось измерять размер экрана до и после видимости клавиатуры. Я не могу использовать этот подход, потому что запускаю это приложение в полноэкранном режиме. Решение 2 может быть полезным, но когда пользователь вводит editText с клавиатуры, я не могу контролировать этот код и не могу поместить этот код в синхронизированный блок. - person Abhijeet Duraphe; 22.10.2013
comment
@ user2907714 Я добавил третье решение. Не уверен, что это сработает. Надеюсь, поможет. - person Piovezan; 22.10.2013
comment
Когда я нажимаю кнопку «Готово», editText не теряет фокус. Я пытаюсь установить фокус на другом компоненте кнопки, но у editText все еще есть фокус. - person Abhijeet Duraphe; 23.10.2013
comment
Я понимаю. У меня нет других идей. Может быть, если я полностью удалю свой ответ, вопрос можно будет сделать доступным для ответа другим участникам? - person Piovezan; 23.10.2013
comment
И последняя идея: соответствует ли прослушивание изменений текста editText нажатию кнопки «Готово» в вашем приложении? - person Piovezan; 23.10.2013