Android:检测打开的键盘,onApplyWindowListener 不起作用

Posted

技术标签:

【中文标题】Android:检测打开的键盘,onApplyWindowListener 不起作用【英文标题】:Android: Detect opened keyboard, onApplyWindowListener not working 【发布时间】:2020-12-31 13:37:39 【问题描述】:

我试图在打开键盘时隐藏布局底部的一个特定按钮,以便为用户提供更多视图。

随着androidx.core:core-ktx:1.5.0-alpha02 的发布,谷歌(最终)添加了一个名为insets.isVisible(WindowInsetsCompat.Type.ime()) 的方法,该方法返回一个布尔值,无论是打开还是点击键盘。

我正在使用基类EmailFragment 来设置函数以实现上述编写的功能。我的问题是我的ViewCompat.setOnApplyWindowInsetsListener(view) 永远不会被调用(没有吐司等)。

我也尝试直接在使用的片段中设置ViewCompat.setOnApplyWindowInsetsListener(view),但这并没有改变。

我的最小 API 是 21,在我的 AndroidManifest.XML 中我有 android:windowSoftInputMode = adjustResize

代码

abstract class EmailFragment<out T: ViewDataBinding>(
    layout: Int,
    // ... some other stuff that is not necessary for the question
) : BaseFragment<T>(layout) 
    // ... some other stuff that is not necesarry for the question

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)
        hideButton(view)
    

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        return super.onCreateView(inflater, container, savedInstanceState)
    

    
    private fun hideButton(view: View) 
        ViewCompat.setOnApplyWindowInsetsListener(view)  v, insets ->
            val isKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
            if (isKeyboardVisible) 
                btn.visibility = View.GONE
                Toast.makeText(requireContext(), "KEYBOARD OPEN", Toast.LENGTH_SHORT).show()
             else 
                btn.visibility = View.VISIBLE
                Toast.makeText(requireContext(), "KEYBOARD CLOSED", Toast.LENGTH_SHORT).show()
            

            // Return the insets to keep going down this event to the view hierarchy
            insets
        
    

从 EmailFragment 继承的片段(五分之一)

class CalibrateRepairMessageFragment(
    //... some other stuff that is not necessary for this question
) : EmailFragment<FragmentCalibrateRepairMessageBinding>(
    R.layout.fragment_calibrate_repair_message,
    //... some other stuff that is not necessary for this question
) 
    //... some other stuff that is not necessary for this question

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)
        //... some other stuff that is not necessary for this question
    

屏幕截图 1(已审查)

屏幕截图 2,不工作(审查)

我知道使用 android:windowSoftInputMode = adjustPen 会使我的按钮“不可见”,但是我不能再滚动了,非常难过..

另一种解决方案可能是键盘只是与按钮重叠,但我不知道该怎么做...

感谢每一个帮助,谢谢。

【问题讨论】:

您使用什么版本的 Android 进行测试? @PankajKumar 我正在使用运行在 Android 10 上的模拟器对其进行测试 你在 Android 11 上测试过吗?而且这个功能还没有发布,所以我建议你等待一段时间,直到使用旧的方式。 @PankajKumar 旧方法是什么?所有这些“旧方法”都不能可靠地工作 @dakshbhatt21 不幸的是,如上所述,此功能要么是 1. 根本不工作(因为 alpha)要么 2. 仅适用于 Android 11 的设备。我稍后会尝试调查,但我不希望这会奏效.. 【参考方案1】:

我能够通过以下方式使其工作:

    在清单中将android:windowSoftInputMode="adjustResize" 添加到Activity 标记 将OnApplyWindowInsetsListener 设置为window.decorView

但是,这对状态栏产生了不幸的副作用,这意味着 OP 的评论(“我不希望这会奏效”)可能是准确的。希望它从 Alpha 版和 Beta 版毕业后能够正常工作。

【讨论】:

我按照您的指南进行了这项工作,但我不知道如何在 kotlin 中使侦听器为空。我需要将顶部的 var 声明为 private var decore: ??我不确定,所以我可以访问它并在 onDestroyView 中将其设为空,否则当我移动到另一个片段时它会导致空。

以上是关于Android:检测打开的键盘,onApplyWindowListener 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

检测点击android后退按钮以关闭键盘

如何检测软件键盘在 Android 电视(消防电视)上是不是可见?

如何使用javascript检测android设备中的键盘关闭事件

Flutter:检测键盘打开和关闭[重复]

如何在 React Native 中检测键盘何时打开或关闭

如何使用 jquery 禁用 android 键盘的弹出窗口?