Функция onFocusChange, вызываемая несколько раз, приводит к невозможности использования переменной hasFocus - PullRequest
1 голос
/ 06 мая 2019

У меня есть два EditText виджета, и я хочу скрыть клавиатуру, когда пользователь нажимает за их пределами (если клавиатура все еще активна в это время, очевидно).Для этого я использую setOnFocusChangeListener на обоих из них следующим образом:

eTNom=convertView.findViewById(R.id.EditText_nom);

eTNom.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) 
            hideKeyboard(v);
    }
});

Другой setOnFocusChangeListener обрабатывается точно так же.

Однако это не работает, потому чтометод onFocusChange вызывается несколько раз (4-5) каждый раз, когда я нажимаю на одну из двух EditText.Это приводит к быстрому переключению переменной hasFocus между истинным и ложным после вызова метода, и клавиатура обнаруживается только в течение очень короткого момента.

Вот именно то, что происходит: https://imgur.com/ZFjXPPz

Я видел этот вопрос один раз, но принятый ответ предложил добавить android:windowSoftInputMode="adjustPan" в файл манифеста.Я сделал это, но это не решило мою проблему.Я также видел людей, которые рекомендовали установить атрибуты clickable , focusable и focusableInTouchMode в true в родительском макете, что я и сделал, но это все же делаетне работает.

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Поместите ниже строки в Menifest

<activity android:name=".ActivityName"
      android:windowSoftInputMode="stateHidden"  />

ИЛИ вы можете показать / скрыть клавиатуру, используя две функции ниже

public void hideSoftKeyboard() {
    if(getCurrentFocus()!=null) {
       InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
       inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

 /* Shows the soft keyboard */
public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);

}

0 голосов
/ 06 мая 2019

Применить таким образом:

etTextInput.setOnFocusChangeListener((v, hasFocus) -> {
                if (hasFocus) {
                    etTextInput.removeTextChangedListener(textWatcher);
                    etTextInput.addTextChangedListener(textWatcher);
                } else {
                    etTextInput.removeTextChangedListener(textWatcher);
                }
            });
...