Как реализовать снятие фокуса с EditText по нажатию Enter на экранной клавиатуре

Имеется EditText. После ввода текста и нажатии Enter на экранной клавиатуре курсор просто переходит на новую строку, фокус остается на EditText, экранная клавиатура не исчезает. Вот код:

      `scheduleName.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                v.clearFocus();
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });`

Интересно то, что при нажатии на Enter не на экранной клавиатуре, а на ноутбуке, экранная клавиатура исчезает, но фокус по прежнему остается на EditText и курсор переходит на новую строку. Хотелось бы чтобы при нажатии enter именно на экранной клавиатуре введенный текст оставался, фокус с editText снимался и клавиатура исчезала. Заранее спасибо за помощь.

PS. Сделал следующее

public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.d("keyCode", String.valueOf(keyCode));
            Log.d("event", event.toString());
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                v.clearFocus();
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                return true;
            }
            return false;
        }

Получается что когда нажимаешь мышкой на экранную клавиатуру эмулятора в android studio, то в лог ничего не выводится. А если нажимаешь enter на клавиатуре ноутбука то реакция есть:

2024-04-06 22:55:22.712  7674-7674  keyCode                 com.example.test1602242              D  66
2024-04-06 22:55:22.713  7674-7674  event                   com.example.test1602242              D  KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=1838984952000, downTime=1838984952000, deviceId=0, source=0x301, displayId=-1 }

Видимо это такая специфика использования эмулятора. Но не понятно как приложение поведет себя на реальном устройстве.


Ответы (1 шт):

Автор решения: iramm
editText.setOnEditorActionListener( new TextView.OnEditorActionListener( ){
        public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
            if(actionId == EditorInfo.IME_ACTION_DONE){
                editText.clearFocus( );
                InputMethodManager iMM = (InputMethodManager)MainActivity.this.getSystemService( Context.INPUT_METHOD_SERVICE );
                iMM.hideSoftInputFromWindow( editText.getWindowToken(), 0 );
            }
            return true;
        }
    });
→ Ссылка