Close/hide the Android Soft Keyboard with Kotlin
我正在尝试在Kotlin中编写一个简单的Android应用程序。我的布局中有一个edittext和一个按钮。在编辑字段中写入内容并单击按钮后,我想隐藏虚拟键盘。
有一个流行的问题关闭/隐藏Android软键盘关于Java的操作,但据我所知,应该有一个替代版本的Kotlin。我该怎么做?
我想我们可以稍微改进一下维克多的回答。基于它始终附加到视图,将有上下文,如果有上下文,则有inputMethodManager
1 2 3 4 | fun View.hideKeyboard() { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(windowToken, 0) } |
在这种情况下,上下文自动表示视图的上下文。你怎么认为?
在活动、片段中使用以下实用程序功能隐藏软键盘。
(*)最新Kotlin版本的更新
1 2 3 4 5 6 7 8 9 10 11 12 | 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) } |
老回答:
1 2 3 4 5 6 7 8 9 10 11 12 | 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) } |
这将关闭键盘,不管您的代码是在对话框片段和/或活动等。
活动/片段中的用法:
1 | hideKeyboard() |
彼得的解决方案通过扩展视图类的功能巧妙地解决了这个问题。另一种方法可能是扩展活动类的功能,从而将隐藏键盘的操作绑定到视图的容器,而不是视图本身。
1 2 3 4 | fun Activity.hideKeyboard() { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0); } |
只需在活动中重写此方法。它也将自动在其子片段中工作…
用Java语言
1 2 3 4 5 6 7 8 | @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); } |
在Kotlin
1 2 3 4 5 6 7 | 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) } |
如果它对你有用的话就投票吧….谢谢。。。。。
你可以用安科来让生活更轻松,所以这条线是:
1 | inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) |
或者最好创建扩展函数:
1 2 3 | fun View.hideKeyboard(inputMethodManager: InputMethodManager) { inputMethodManager.hideSoftInputFromWindow(windowToken, 0) } |
这样称呼它:
1 | view?.hideKeyboard(activity.inputMethodManager) |
生成名为utils的对象类:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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() } } } |
您可以在任何想要隐藏软输入键盘的类中使用此方法。我在我的电脑里用这个。
这里的视图是您在布局中使用的任何视图:
1 | Utils.hideSoftKeyBoard(this@BaseActivity, view ) |
我在这里找到了适合我的答案:http://programminget.blogspot.com/2017/08/how-to-close-android-soft-keyboard.html
1 2 | val inputManager:InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.hideSoftInputFromWindow(currentFocus.windowToken, InputMethodManager.SHOW_FORCED) |
这与API 26很好地配合使用。
1 2 3 | val view: View = if (currentFocus == null) View(this) else currentFocus val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) |
您可以使用下面的代码,我在片段中编写下面的代码:
1 2 3 | private val myLayout = ViewTreeObserver.OnGlobalLayoutListener { yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView) } |
然后在
1 2 3 4 | ...... super.onViewCreated(view, savedInstanceState) myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout) ...... |
在
1 2 3 4 | override fun onDestroyView() { super.onDestroyView() myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout) } |
还有:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 } } |