【问题标题】:Spinner inside ScrollView is closing when opened programmatically以编程方式打开时,ScrollView 内的微调器正在关闭
【发布时间】:2019-07-31 17:13:59
【问题描述】:

我有一些EditText 行的类似表单的布局。最后一行是Spinner。我想在最后一个EditText 中点击Done 按钮时打开抽屉菜单。但是行为很奇怪。每次我点击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
        }

【问题讨论】:

    标签: android android-layout kotlin android-spinner android-scrollview


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 之前已经尝试过了。同样的问题。但我发现如果我在不隐藏键盘的情况下调用 performClick(),抽屉仍然可见。它与隐藏键盘有关,它触发微调器的关闭事件。并且 editText?.clearFocus() 没有关闭键盘
    • 当我使用scrollTo 时,您的代码对我来说可以正常工作,您确定您使用的是scrollTo 而不是smoothScrollTo?我仍然觉得微调器关闭的最可能原因是ScrollView 正在运行。
    • 是的,我复制粘贴了您的代码,但仍然无法正常工作:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多