Как удерживать программную клавиатуру в нажатом состоянии при переключении на следующий текст EditText в режиме рециркуляции? - PullRequest
3 голосов
/ 23 мая 2019

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

Другая проблема заключается в том, что при наличии EditText, который в данный момент не отображается на экране, он не получит фокус, пока пользователь не выберет его.

Я попытался с помощью диспетчера методов ввода показать клавиатуру, когда текст редактирования имеет фокус, и скрыть, когда ее нет. Если больше не активированы EditTexts, клавиатура все еще присутствует.

final InputMethodManager imm = (InputMethodManager) 
context.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (variable.getType().equals("Value")) {
        if (variable.getFormat().equals("Number") || variable.getFormat().equals("2Number")) {
            viewHolder.inputValue.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean hasFocus) {
                    if(hasFocus){
                        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
                    } else if(hasFocus && !viewHolder.inputValue.isEnabled()){
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                    }
                }
            });
        } else if (variable.getFormat().equals("Text")) {
            viewHolder.messageText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View view, boolean hasFocus) {
                    if(hasFocus){
                        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
                    } else if(hasFocus && !viewHolder.inputValue.isEnabled()){
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                    }
                }
            });
        }
    } else if (variable.getType().equals("Message")) {
        viewHolder.messageText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if(hasFocus){
                    imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
                } else if(hasFocus && !viewHolder.inputValue.isEnabled()){
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
        });
    } else {
        //imm.hideSoftInputFromWindow(viewHolder.itemView.getWindowToken(), 0);
    }

EditTexts хранятся в виде карт в обзоре переработчика. Каждая карта имеет тип переменной. Только переменные типа «Значение» и «Сообщение» должны получать фокус при нажатии следующей кнопки на клавиатуре.

Я ожидаю, что пользователь сможет прокручивать включенные EditTexts в RecyclerView, нажав следующую кнопку на клавиатуре. Если EditText не отображается на экране, экран должен прокрутиться вниз, чтобы получить фокус. Кроме того, если EditText отключен, он никогда не должен фокусироваться.

1 Ответ

1 голос
/ 23 мая 2019

Переопределите метод onEditorAction и возвращайте true для каждого editText, который вы хотите оставить открытой.

edittext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
      @Override
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
          if (actionId == EditorInfo.IME_ACTION_DONE) {
             //optional: you can run some logic here.
          }
          //return true to not hide the keyboard
          return true;
      }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...