Остановить фокус на EditText, когда клавиатура скрыта - PullRequest
0 голосов
/ 13 мая 2019

Я из разработки для iOS и делаю новые разработки для Android, в Android что-то действительно странное для меня, почему EditText остается сфокусированным, когда клавиатура скрыта ??

Я пытался установить OnFocusChangeListener намой EditText, но это не работает, когда клавиатура скрывается, слушатель не вызывается.

Я также пытался обнаружить скрытие клавиатуры с помощью onChangeListener, но он не работает .. (только с жесткой клавиатуройпо-видимому).

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // not called when keyboard hides
        }
    });

Я долго искал и нашел ответ только для остановки фокуса при первом запуске, но это не то, что я искал ..

Спасибо

Ответы [ 6 ]

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

Ладно, вроде этого

  private void setUpEtxFocusListener() {
    etx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                if ((LOG_DEBUG)) Log.d(TAG, "etx : GOT Focus");

            } else {
                if ((LOG_DEBUG)) Log.d(TAG, "etx : LOST Focus");

            }
        }
    });

и при щелчке снаружи, etx потеряет фокус, и вы скроете клавиатуру

 //this will trigger etx  setOnFocusChangeListener -  onFocus change() - NO FOCUS clause
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            Rect outRect = new Rect();
            v.getGlobalVisibleRect(outRect);
            if (!outRect.contains((int) event.getRawX(), (int) event.getRawY())) {
                v.clearFocus();
               // just an utility class to hide.
                UtilExtra.hideKeyboard(this);
            }
        }
    }
    return super.dispatchTouchEvent(event);
}
0 голосов
/ 13 мая 2019

Недавно я решил эту проблему именно с хорошей библиотекой. Он обрабатывает Событие видимости клавиатуры.

Добавьте это к вашему файлу Gradle уровня приложения .

dependencies {
implementation'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.3.0'
}

Включить событие клавиатуры:

KeyboardVisibilityEvent.setEventListener(
    getActivity(),
    new KeyboardVisibilityEventListener() {
        @Override
        public void onVisibilityChanged(boolean isOpen) {
            if (isOpen)
                  //Keyboard is showing.
            else
               yourEditText.clearFocus()
               yourEditText.setCursorVisible(false) //Only if the cursor keeps blinking else no need use it.
                 //Keyboard is now closed.
        }
    });

К сожалению, не существует «правильного» способа обработки события видимости клавиатуры. Все, что вы получите, это взломать, чтобы обнаружить это.

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

Используйте editText.clearFocus () и editText.setCursorVisible (false) оба метода, это может вам помочь.

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

Чтобы поймать событие открытия / закрытия клавиатуры, используйте этот код:

    //...
    private int layoutSize = 0;
    private boolean isKeyboardVisible = false;
    //...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setKeyboardOpenListener();
    }
    //...
    private void setKeyboardOpenListener() {
            View activityRootView = findViewById(android.R.id.content);
            activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
                if (activityRootView.getHeight() + Util.getStatusBarHeight(this) >= layoutSize) {
                    layoutSize = activityRootView.getHeight();
                    if (isKeyboardVisible) {
                        isKeyboardVisible = false;
                        onKeyboardClose();
                    }
                } else {
                    if (!isKeyboardVisible) {
                        isKeyboardVisible = true;
                        onKeyboardOpen();
                    }
                }
            });
        }
    //...
    public static int getStatusBarHeight(Context context) {
            int result = 0;
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }
0 голосов
/ 13 мая 2019

Вы можете просто использовать этот код, и ваш фокус исчезнет

editText.clearFocus();
0 голосов
/ 13 мая 2019

Попробуйте это:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...