Закрыть/скрыть 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)
Ответ 7
Я нашел ответ, который работал для меня здесь: 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
Это хорошо работает с 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)
}