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 电视(消防电视)上是不是可见?