Home > Back-end >  requestFocus() on EditText, dismiss BotSheetDialog w/o hide keyboard and keyboard strangely show up
requestFocus() on EditText, dismiss BotSheetDialog w/o hide keyboard and keyboard strangely show up

Time:10-02

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>
  • Related