0

我有使用 InputMethodManager 隐藏软键盘的 Java 代码。当我将代码转换为 Kotlin 时,相同的代码会引发 NoMethodFound 异常。

我可以轻松地在 Java 和 Kotlin 版本之间切换,并演示 Java 中的正确行为和 Kotlin 中的错误行为。

Java 代码

            searchText.clearFocus();
            InputMethodManager imm = (InputMethodManager)dialog.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
            try {
                imm.hideSoftInputFromWindow(searchText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            } catch (Throwable t) {
                String stop = "here";
            }

科特林代码

            searchText!!.clearFocus()
            val imm = dialog!!.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
            try {
                imm.hideSoftInputFromWindow(searchText!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
            } catch (t: Throwable) {
                val stop = "here"
            }

Java 代码表现出正确的行为并关闭软键盘。Kotlin 代码抛出异常

"java.lang.NoSuchMethodError: 类 Landroid/view/inputmethod/InputMethodManager 中没有虚拟方法 hideSoftInputFromWindow(Landroid/os/IBinder;I)V; 或其超类('android.view.inputmethod.InputMethodManager' 的声明出现在 /系统/框架/framework.jar:classes2.dex)"

4

2 回答 2

0

看起来这种方法在Context. 尝试Context从您的应用程序上下文中使用。要获取应用程序的上下文,请执行类似的操作在 kotlin 中获取应用程序的一些谷歌搜索可能会有所帮助。

于 2019-10-12T18:56:55.880 回答
0

这不是答案,而是一种解决方法。我将 Kotlin 代码重构回 Java,并将其作为静态方法放置在辅助类中。该方法是从 Kotlin 调用的。

public class DialogHelper {
public static void hideKeyboard(EditText searchText, Dialog dialog) {
    searchText.clearFocus();
    InputMethodManager imm = (InputMethodManager)dialog.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
    try {
        imm.hideSoftInputFromWindow(searchText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    } catch (Throwable t) {
        String stop = "here";
    }
}

}

现在代码可以正常工作了:软键盘被隐藏并且没有抛出异常。

我仍然想知道是否有人可以解释为什么它有效,而直接的 Kotlin 代码却没有。

于 2019-10-12T22:00:45.670 回答