我在Java中有使用InputMethodManager隐藏软键盘的代码。当我将代码转换为 Kotlin 时,相同的代码会引发 NoMethodFound 异常。
我可以轻松地在 Java 和 Kotlin 版本之间切换,并演示 Java 中的正确行为和 Kotlin 中的错误行为。
爪哇代码
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: no virtual method hideSoftInputFromWindow(Landroid/os/IBinder;I(V类 Landroid/view/inputmethod/InputMethodManager;或其超类 (出现"android.view.inputmethod.InputMethodManager"的声明 在/system/framework/framework.jar:classes2.dex(">
看起来这种方法在Context
中不可用。尝试使用应用程序上下文中的Context
。为了获取应用程序的上下文,做这样的事情,或者一些关于在 kotlin 中获取应用程序的谷歌搜索可能会有所帮助。
这不是答案,而是一种解决方法。 我将 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 代码不起作用。