【问题标题】:hideSoftInputFromWindow throws NoSuchMethodErrorhideSoftInputFromWindow 抛出 NoSuchMethodError
【发布时间】:2020-02-09 21:54:21
【问题描述】:

我有使用 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";
            }

Kotlin 代码

            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: 没有虚拟方法 类中的 hideSoftInputFromWindow(Landroid/os/IBinder;I)V landroid/view/inputmethod/InputMethodManager;或其超类 (出现'android.view.inputmethod.InputMethodManager'的声明 在 /system/framework/framework.jar:classes2.dex)"

【问题讨论】:

    标签: java android kotlin inputmethodmanager


    【解决方案1】:

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

    【讨论】:

    • 原始问题中的代码在作为主要活动意图启动的活动中的对话框中运行。根据您的建议,我确定应用程序上下文与活动上下文相同,但与对话上下文不同。但是,两种上下文都提供相同的 InputMethodManager。
    【解决方案2】:

    这不是答案,而是解决方法。 我将 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 代码却不能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2017-11-09
      相关资源
      最近更新 更多