隐藏键盘返回空指针

时间:2019-02-07 16:47:34

标签: android crash keyboard

我刚刚收到我的应用程序崩溃的Fabric邮件,我在移动设备上对其进行了测试,但是运行正常,但是我不为什么它在OS 9上崩溃。

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

上面是我的 onCreate 方法, relative_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 :(得分:0)

您可以使用此方法隐藏键盘:

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);
    }
}

答案 1 :(得分:0)

尝试用下面的代码替换您的hideKeyboard方法,我正在使用这是我的应用程序来隐藏键盘,并且效果很好:

private void hideKeyboard() {
    getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

答案 2 :(得分:0)

由于无法在焦点上找到任何视图而崩溃,并且getCurrentFocus()返回null。

  

在API级别1中添加

     

公共抽象视图getCurrentFocus()

     

在此窗口中返回当前具有焦点的视图,如果没有,则返回null。请注意,这不会出现在任何包含Window的窗口中。   (source

替换此:

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

与此:

imm.hideSoftInputFromWindow(getWindow().getDecorView().getRootView().getWindowToken(), 0);