скрытие клавиатуры, возвращающей нулевой указатель - PullRequest
0 голосов
/ 07 февраля 2019

Я только что получил фабричное письмо о том, что мое приложение упало, и я тестирую его на своем мобильном телефоне, но оно работает нормально, но я не знаю, почему оно вылетает в ОС 9.

context = this;
RelativeLayout parentView = findViewById(R.id.relative_cusweb_parent); 
setupParent(parentView);

Выше мое Метод onCreate & lative_cusweb_parent - это основной относительный макет класса CustomWeb.

private void setupParent(View view) {
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                hideKeyboard();
                return false;
            }
        });
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupParent(innerView);
        }
    }
}

private void hideKeyboard() {
    input.clearFocus();
    InputMethodManager imm = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    {
        imm.hideSoftInputFromWindow(Objects.requireNonNull(getCurrentFocus()).getWindowToken(), 0); // here a is crashing
    }
}

В этой строке происходит сбой приложения

imm.hideSoftInputFromWindow(Objects.requireNonNull(getCurrentFocus()).getWindowToken(), 0);

и ниже - журнал

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
   at codeline.onlinebills.activities.CustomWeb.hideKeyboard(CustomWeb.java:222)
   at codeline.onlinebills.activities.CustomWeb.access$200(CustomWeb.java:38)
   at codeline.onlinebills.activities.CustomWeb$4.onTouch(CustomWeb.java:231)
   at android.view.View.dispatchTouchEvent(View.java:12611)
   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3035)
   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2714)
   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3041)
   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2671)

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Попробуйте заменить ваш метод hideKeyboard приведенным ниже кодом, я использую это мое приложение, чтобы скрыть клавиатуру, и оно отлично работает:

private void hideKeyboard() {
    getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
0 голосов
/ 07 февраля 2019

Это сбой, потому что он не находит никакого вида в фокусе и getCurrentFocus () возвращает ноль.

добавлено на уровне API 1

public abstract View getCurrentFocus ()

Возвращает представление в этом окне, которое в данный момент имеет фокус, или ноль, если его нет.Обратите внимание, что это не выглядит ни в каком содержащем Window.( источник )

Заменить это:

imm.hideSoftInputFromWindow(Objects.requireNonNull(getCurrentFocus()).getWindowToken(), 0);

на это:

imm.hideSoftInputFromWindow(getWindow().getDecorView().getRootView().getWindowToken(), 0);
0 голосов
/ 07 февраля 2019

Вы можете скрыть клавиатуру следующим способом:

private void hideKeyBoard()
{
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        if( imm != null )
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}
...