-1

一开始的代码是:

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

警告信息是:

方法调用“hideSoftInputFromWindow”可能会产生“java.lang.NullPointerException”

所以我将提示下的代码更改为:

private void hideKeyboard()
    {
        View view = getCurrentFocus();
        if (view != null)
        {
            ((InputMethodManager) Objects.requireNonNull(getSystemService(Context.INPUT_METHOD_SERVICE)))
                    .hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }

这次警告信息是:

调用需要 api 级别 19 当前最小值为 16 java.util.objects#requirenonnull

我怎么知道?谢谢你。

4

2 回答 2

4

该类是在 API 19 中添加到 Android 平台的,因此尝试在任何运行 API 18 或更低版本的设备上使用java.util.Objects该类及其方法会导致崩溃。

通常,您可以通过在运行时检查设备的 API 级别来解决此问题,使用如下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // do your work here
}

KITKAT常量定义为19,因此在本例中,我们的代码只能在 API 19 或更新版本的设备上运行。)

但是,在您的特定情况下,您真的只想摆脱编译器警告;不必使用Objects.requireNonNull()这样做。如果你想要与 相同的行为Objects.requireNonNull()你可以这样写:

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

if (imm == null) {
    throw new NullPointerException();
}

imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
于 2018-08-28T17:59:04.273 回答
0

试试下面

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
于 2018-08-28T16:17:02.870 回答