首页 > 解决方案 > 以编程方式打开时,ScrollView 内的微调器正在关闭

问题描述

我有一些EditText行的形式布局。最后一行是Spinner. 我想Done在最后点击按钮时打开抽屉菜单EditText。但是行为很奇怪。每次我点击Done它时,它都会在几分之一秒内打开抽屉菜单,然后菜单立即关闭。你知道任何解决方案。我认为这会ScrollView引起一些问题。因为我在另一个布局中使用相同的功能,但ScrollView它工作正常。

//hide keyboard and auto-open dropdown menu on last EditText in form
editText?.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE){
        editText?.let { app.hideKeyboard(it) }
        spinner?.performClick()
    }
    true
}

fun hideKeyboard(view: View){
        val imm = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }

更新:

CustomSpinner从教程中使用过,然后我想听打开事件并隐藏键盘。它仍在关闭该下拉菜单。我真的不知道是什么原因造成的。尝试手动向下滚动到底部,仍然是同样的问题。

更新 - 解决方案

我必须为它的最底部的全滚动创建处理程序,ScrollView而且我必须放入spinner.performClick()处理程序,因为隐藏键盘正在改变屏幕高度并且ScrollView将关闭选项菜单,直到键盘最终被隐藏。

这意味着延迟 fullscroll 和 performclick 不会关闭选项菜单。

代码:

editText?.setOnEditorActionListener { v, actionId, _ ->
            if (actionId == EditorInfo.IME_ACTION_DONE){
                v?.apply {
                    clearFocus()
                    app.hideKeyboard(this)
                    post(delay = 200){scrollView?.fullScroll(View.FOCUS_DOWN)}
                }
                post(delay = 200) {spinner?.performClick()}
            }
            true
        }

标签: androidandroid-layoutkotlinandroid-spinnerandroid-scrollview

解决方案


在打开它之前尝试滚动到微调器。

editText?.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE){
        editText?.let { app.hideKeyboard(it) }
        spinner?.let {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                scrollView?.scrollToDescendant(it)
            } else {
                scrollView?.scrollTo(0, it.getBottom())
            }
            it.performClick()
        }
    }
    true
}

推荐阅读