Android中如何区分软键盘是在当前应用还是其他应用中打开
Android中如何区分软键盘是在当前应用还是其他应用中打开
嗨,这个问题我之前做分屏适配的时候也碰到过!Android确实不像iOS那样有UIResponder.keyboardIsLocalUserInfoKey这种直接的API来一键判断键盘归属,但咱们可以通过几个条件组合来实现同样的效果,下面给你一步步说清楚:
先说说你现有代码的局限
你当前用WindowInsetsCompat监听键盘可见性的代码没问题,但它只能告诉你“键盘弹出来了”,没法区分这个键盘是给当前应用输入用的,还是分屏模式下另一个应用唤起的。
两种可行的判断方案
方案一:结合InputMethodManager判断输入窗口归属
这个方法是通过系统的输入法管理类,直接对比当前输入法窗口和应用窗口的标识,来确定键盘是不是当前应用唤起的,准确度比较高:
val rootView = window.decorView.findViewById<View>(android.R.id.content) ViewCompat.setOnApplyWindowInsetsListener(rootView) { _, insets -> val isKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) if (isKeyboardVisible) { val isCurrentAppKeyboard = isKeyboardForCurrentApp() if (isCurrentAppKeyboard) { // 这里处理当前应用键盘弹出的逻辑 } } insets // 记得返回insets,否则可能影响其他Insets处理 } // 核心判断方法 private fun isKeyboardForCurrentApp(): Boolean { val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager // 获取当前输入法关联的窗口 val inputWindow = imm.currentInputMethodWindow // 获取当前Activity的窗口标识 val appWindowToken = window.attributes.token // 对比两个窗口的标识,一致的话说明键盘属于当前应用 return inputWindow != null && inputWindow.token == appWindowToken }
方案二:结合视图焦点判断
如果你的应用逻辑里,键盘弹出一定是因为当前有输入控件(比如EditText)获得焦点,那也可以通过检查视图焦点来辅助判断:
val rootView = window.decorView.findViewById<View>(android.R.id.content) ViewCompat.setOnApplyWindowInsetsListener(rootView) { _, insets -> val isKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()) if (isKeyboardVisible) { // 检查根视图或其子视图是否有焦点 val hasActiveFocus = rootView.hasFocus() || rootView.findFocus() != null if (hasActiveFocus) { // 处理当前应用键盘逻辑 } } insets }
注意:这个方案有个小局限,如果用户在分屏模式下,当前应用的输入控件有焦点,但键盘却被另一个应用唤起的话,可能会误判。所以如果追求准确性,优先用方案一。
最后再对比下iOS的实现
你提到iOS有UIResponder.keyboardIsLocalUserInfoKey这个直接的标识,确实很省心,但Android因为系统设计的差异,没有提供直接的字段,所以只能通过这种组合判断的方式来达到同样的效果。
内容来源于stack exchange
相关产品推荐
相关产品推荐

