hideSoftInputFromWindow выбрасывает NoSuchMethodError - PullRequest
0 голосов
/ 12 октября 2019

У меня есть код на Java, который скрывает программную клавиатуру с помощью InputMethodManager. Когда я конвертирую код в 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 code

            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)"

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Это не ответ, а обходной путь. Я реорганизовал код 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";
    }
}

}

Теперь код работает так, как он должен: программная клавиатура скрыта и исключение не выдается.

Iвсе еще задаюсь вопросом, может ли кто-нибудь пролить свет на то, почему это работает, а прямой код Котлина - нет.

0 голосов
/ 12 октября 2019

Похоже, этот метод недоступен в Context. Попробуйте использовать Context из контекста вашего приложения. Для получения контекста приложения сделайте что-то вроде this или вам может помочь поиск приложения в kotlin.

...