I have an EditText inside BotSheetDialog, requestFocus() on it on onViewCreated(). And then I can dismiss the dialog in two way: click the SAVE button or click to the outside of the dialog. If i manually press hide keyboard button, it will work as expected. But if I don't do that, keyboard will show from nowhere.
// BottomDialog.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
loadArgs()
setClickListeners()
binding.etTitle.requestFocus()
}
I have tried to clearFocus() on it before Destroy View but it doesn't work.
// BottomDialog.kt
override fun onDestroyView() {
binding.etTitle.clearFocus()
super.onDestroyView()
}
Thank you in advance! Here are the figures:
https://i.stack.imgur.com/TGBQG.png
https://i.stack.imgur.com/eUn5s.png
UPDATE
// My fun to hide keyboard
fun Activity.hideSoftKeyboard(view: View? = null) : Boolean {
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as
InputMethodManager
if (inputMethodManager.isAcceptingText) {
if (view == null) {
inputMethodManager.hideSoftInputFromWindow(this.currentFocus?.windowToken, 0)
} else {
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
return true
}
return false
}
- I'm trying to call it on dialog's ecycle events:
// BottomDialog.kt
override fun onPause() {
val res = requireActivity().hideSoftKeyboard(binding.etTitle)
log("onPause, $res")
super.onPause()
}
override fun onStop() {
val res = requireActivity().hideSoftKeyboard(binding.etTitle)
log("onStop, $res")
super.onStop()
}
override fun onDestroyView() {
val res = requireActivity().hideSoftKeyboard(binding.etTitle)
log("onDestroyView, $res")
super.onDestroyView()
}
override fun onDestroy() {
val res = requireActivity().hideSoftKeyboard(binding.etTitle)
log("onDestroy, $res")
super.onDestroy()
}
/*
Logcat:
onPause, false
onStop, false
onDestroyView, false
onDestroy, false
*/
CodePudding user response:
Use below fun to hide the keyboard:
fun dismissKeyboard() {
val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
if( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, 0)
}
CodePudding user response:
I solved it:
// AndroidManifest.com
<activity
...
// Change this
android:windowSoftInputMode="stateVisible|adjustPan"
// Into this
android:windowSoftInputMode="adjustPan"
...
</activity>