Скрыть клавиатуру после изменения фокуса редактируемого текста в Android

#java #android

Вопрос:

В настоящее время у меня возникла проблема со скрытием клавиатуры при переключении между редактируемым текстом. Я спрятал клавиатуру со следующим исходным кодом:

 edittext1.setOnTouchListener(new View.OnTouchListener() {  @Override  public boolean onTouch(View v, MotionEvent event) {  edittext1.requestfocus();  InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);  return true;  } });  edittext2.setOnTouchListener(new View.OnTouchListener() {  @Override  public boolean onTouch(View v, MotionEvent event) {  edittext1.requestfocus();  InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);  return true;  } })  

Но вышеприведенный код не увенчался успехом. Каждый раз, когда я прикасаюсь к нему, появляется клавиатура. При удерживании нажатой кнопки edittext и перемещении за пределы области edittext по-прежнему отображается клавиатура.

Я не знаю, как скрыть клавиатуру, когда:

  1. пользователь нажимает editext2 и editext2.requestfocus() из фокуса-это edittext1
  2. удерживайте нажатой клавишу edittext и переместитесь за пределы edittext, когда она будет отпущена, клавиатура покажет

Можете ли вы помочь мне в этом деле? Спасибо.

Ответ №1:

 public class CompositeOnChangeFocusListener implements OnFocusChangeListener{  private View currentFocusedView = null;  public void onFocusChange(View v, boolean hasFocus) {  //on a focus change.  if(currentFocusedView != v){  InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);  }  //case a view in this composite has focus.  if(hasFocus) {  currentFocusedView = v;  }  //case no view using this composite is focused.  if(v == currentFocusedView amp;amp; !hasFocus){  currentFocusedView = null;  InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);  }  } }  

Эта реализация OnFocusChangeListener будет отслеживать текущую фокусировку View , если фокус изменился, она удалит клавиатуру. Он также обновит, какое представление ориентировано на основе hasFocused boolean .

 OnFocusChangeListener listner = new CompositeOnFocusChangeListener(); //Attach the same exact listener to both. edittext1.setOnFocusChangeListener(listner); edittext2.setOnFocusChangeListener(listner);  

Также попробуйте настроить вид верхнего уровня в XML-файле макета на фокусируемый, таким образом, когда вы соскользнете EditText , фокус должен перейти на вид верхнего уровня, а не прилипать к EditText нему .