Закрыть/скрыть Softkey от Android с Kotlin

Я пытаюсь написать простое приложение для Android в Котлине. В моем макете есть EditText и кнопка. После записи в поле редактирования и нажатия на кнопку я хочу скрыть виртуальную клавиатуру.

Существует популярный вопрос " Закрыть/скрыть Android Soft Keyboard" о том, как это сделать на Java, но, насколько я понимаю, должна быть альтернативная версия для Kotlin. Как я должен это делать?

Ответ 1

Я думаю, что мы можем немного улучшить ответ Виктора. На основе этого всегда привязаны к представлению, будет контекст, если есть контекст, то есть InputMethodManager

fun View.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(windowToken, 0)
}

В этом случае контекст автоматически означает контекст представления. Как вы думаете?

Ответ 2

Используйте следующие служебные функции в вашей деятельности, фрагменты, чтобы скрыть программную клавиатуру.

(*) Обновление для последней версии Kotlin

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

Старый ответ:

fun Fragment.hideKeyboard() {
    activity.hideKeyboard(view)
}

fun Activity.hideKeyboard() {
    hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

Это закроет клавиатуру независимо от вашего кода в фрагменте диалога и/или активности и т.д.

Использование в Деятельности/Фрагмент:

hideKeyboard()

Ответ 3

Просто переопределите этот метод в своей деятельности. Он также автоматически работает в своих дочерних фрагментах.....

В ЯВА

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (getCurrentFocus() != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
    return super.dispatchTouchEvent(ev);
}

В котлине

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if (currentFocus != null) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
        }
        return super.dispatchTouchEvent(ev)
    }

Проголосуйте, если это работает для вас.... Спасибо.....

Ответ 4

Решение Peter решительно решает проблему, расширяя функциональность класса View. Альтернативный подход может заключаться в расширении функциональности класса Activity и, таким образом, связывании операции сокрытия клавиатуры с контейнером View, а не в представлении.

fun Activity.hideKeyboard() {
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0);
}

Ответ 5

Создайте объектный класс с именем Utils:

object Utils {

    fun hideSoftKeyBoard(context: Context, view: View) {
        try {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        } catch (e: Exception) {
            // TODO: handle exception
            e.printStackTrace()
        }

    }
}

Вы можете использовать этот метод в любом классе, где вы хотите скрыть программную клавиатуру ввода. Я использую это в моей BaseActivity.

Здесь представление - это любое представление, которое вы используете в макете:

Utils.hideSoftKeyBoard([email protected], view )

Ответ 6

Вы можете использовать Anko, чтобы облегчить жизнь, поэтому линия будет:

inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

или, возможно, лучше создать функцию расширения:

fun View.hideKeyboard(inputMethodManager: InputMethodManager) {
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

и назовите его так:

view?.hideKeyboard(activity.inputMethodManager)

Ответ 8

Это хорошо работает с API 26.

val view: View = if (currentFocus == null) View(this) else currentFocus
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

Ответ 9

Вы можете использовать ниже код, я пишу ниже код в моем фрагменте:

private val myLayout = ViewTreeObserver.OnGlobalLayoutListener {
    yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView)
}

Затем в onViewCreated fragment:

......
super.onViewCreated(view, savedInstanceState)
myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout)
......

И в onDestroyView используйте тоже:

override fun onDestroyView() {
    super.onDestroyView()
 myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout)
}

А также:

object KeyboardTool {
    fun isSoftKeyboardShown(rootView: View): Boolean {
        val softKeyboardHeight = 100
        val rect = Rect()

        rootView.getWindowVisibleDisplayFrame(rect)

        val dm = rootView.resources.displayMetrics
        val heightDiff = rootView.bottom - rect.bottom
        return heightDiff > softKeyboardHeight * dm.density
    }
}

Ответ 10

InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);

Ответ 11

В своей деятельности или фрагменте создайте функцию как:

fun View.hideKeyboard() {
 val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
      inputManager.hideSoftInputFromWindow(windowToken, 0)
}

предположим, что у вас есть кнопка с идентификатором your_button_id в XML файле, относящемся к этой операции или фрагменту, поэтому при событии нажатия кнопки:

    your_button_id.setOnClickListener{
       it.hideKeyboard()
     }

Ответ 12

Вот мое решение в Котлине для фрагмента. Поместите его внутрь кнопки setOnClickListener.

val imm = context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)

Ответ 13

В своей деятельности или фрагменте создайте функцию как:

fun View.hideKeyboard(inputMethodManager: InputMethodManager) {
      inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Предположим, у вас есть кнопка с идентификатором your_button_id в XML файле, относящемся к этому your_button_id или фрагменту, поэтому при событии нажатия кнопки:

    your_button_id.setOnClickListener{
       val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
       it.hideKeyboard(inputManager)
     }