使用Kotlin关闭/隐藏Android软键盘

时间:2017-01-22 11:32:56

标签: android android-softkeyboard kotlin

我正在尝试在Kotlin中编写一个简单的Android应用程序。我的布局中有一个EditText和一个Button。在编辑字段中写入并单击按钮后,我想隐藏虚拟键盘。

在Java中有一个热门问题 Close/hide the Android Soft Keyboard,但就我所知,Kotlin应该有另一个版本。我该怎么办?

16 个答案:

答案 0 :(得分:33)

我认为我们可以稍微改善Viktor的答案。基于它始终附加到视图,将有上下文,如果有上下文,那么有InputMethodManager

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

在这种情况下,上下文自动表示视图的上下文。 你觉得怎么样?

答案 1 :(得分:19)

在“活动”,“片段”中使用以下实用程序功能隐藏软键盘。

(*)最新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()

答案 2 :(得分:4)

彼得的解决方案通过扩展View类的功能来解决问题。替代方法可以是扩展Activity类的功能,从而绑定隐藏键盘与View容器而不是View本身的操作。

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

答案 3 :(得分:4)

仅在您的活动中覆盖此方法。它也会自动在其子片段中工作。.....

在JAVA中

@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 :(得分:2)

您可以使用Anko让生活更轻松,因此该行将是:

inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

或者更好的创建扩展功能:

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

并将其称为:

view?.hideKeyboard(activity.inputMethodManager)

答案 5 :(得分:2)

在“活动”或“片段”中创建一个函数,如下:

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

假设您在与该活动或片段相关的XML文件中有一个ID为your_button_id的按钮,因此,单击按钮事件:

    your_button_id.setOnClickListener{
       it.hideKeyboard()
     }

答案 6 :(得分:1)

这适用于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)

答案 7 :(得分:1)

我在这里找到了对我有用的答案:http://programminget.blogspot.com/2017/08/how-to-close-android-soft-keyboard.html

val inputManager:InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(currentFocus.windowToken, InputMethodManager.SHOW_FORCED)

答案 8 :(得分:1)

制作一个名为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(this@BaseActivity, view )

答案 9 :(得分:1)

感谢@Zeeshan Ayaz 这是一个改进的版本

由于'currentFocus'为空,我们最好使用Kotlin的?.let进行检查

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

答案 10 :(得分:1)

我没有看到 Kotlin 扩展函数的这个变体:

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

它的好处是可以从每个 CustomView 和每个单击或触摸侦听器中调用此扩展函数

答案 11 :(得分:0)

您可以使用以下代码,在我的片段中编写以下代码:

ConstraintLayout

然后在private val myLayout = ViewTreeObserver.OnGlobalLayoutListener { yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView) } 的{​​{1}}中:

onViewCreated

fragment中也使用:

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

并且:

onDestroyView

答案 12 :(得分:0)

这是我在Kotlin中的Fragment解决方案。将其放在按钮的setOnClickListener内。

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

答案 13 :(得分:0)

科特琳 我使用下面的代码:

import splitties.systemservices.inputMethodManager

inputMethodManager.hideSoftInputFromWindow(view?.windowToken,0)

答案 14 :(得分:0)

尽管答案很多,但此答案与 KOTLIN 中的最佳做法有关,该方法通过打开和关闭具有生命周期和扩展功能的键盘来实现。

1)。创建扩展功能,创建文件 EditTextExtension.kt 并粘贴以下代码

fun EditText.showKeyboard(
 ) {
  requestFocus()
  val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as 
  InputMethodManager
  imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
 }

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

2)。创建LifeCycleObserver类创建类 EditTextKeyboardLifecycleObserver.kt 并将代码粘贴到下面

class EditTextKeyboardLifecycleObserver(
 private val editText: WeakReference<EditText>
 ) :
 LifecycleObserver {

 @OnLifecycleEvent(
     Lifecycle.Event.ON_RESUME
 )
 fun openKeyboard() {
     editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 50)
 }
 fun hideKeyboard() {
     editText.get()?.postDelayed({ editText.get()?.hideKeyboard() }, 50)
 }
}

3)。然后在 onViewCreated / onCreateView

中使用以下代码
lifecycle.addObserver(
         EditTextKeyboardLifecycleObserver(
             WeakReference(mEditText) //mEditText is the object(EditText)
         )
     )

当用户打开片段或活动时,键盘将打开。

如果您遇到任何问题,请在评论后随意提出以下解决方案。

答案 15 :(得分:-1)

在“活动”或“片段”中创建一个函数,如下:

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

假设您在与该活动或片段相关的XML文件中有一个ID为your_button_id的按钮,因此,单击按钮事件:

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