Activity设为adjustNothing时的软键盘可见性监听问题
解决adjustNothing下监听软键盘显隐控制View可见性的问题
当设置android:windowSoftInputMode="adjustNothing"时,系统不会调整窗口布局,这会导致依赖布局变化的软键盘监听方案(包括你使用的KeyboardVisibilityEvent库)失效。以下是两种可行的解决方案:
方案一:结合EditText焦点监听+InputMethodManager状态判断
这种方案无需额外依赖库,通过监听EditText焦点变化,配合输入法管理器判断软键盘状态来控制目标View的显示:
- 给两个EditText设置焦点监听器:
EditText et1 = findViewById(R.id.et1); EditText et2 = findViewById(R.id.et2); View targetView = findViewById(R.id.target_view); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); View.OnFocusChangeListener focusChangeListener = (v, hasFocus) -> { if (hasFocus) { // 获取焦点时隐藏目标View targetView.setVisibility(View.GONE); } else { // 失去焦点时,判断软键盘是否已完全关闭 if (!imm.isActive(et1) && !imm.isActive(et2)) { targetView.setVisibility(View.VISIBLE); } } }; et1.setOnFocusChangeListener(focusChangeListener); et2.setOnFocusChangeListener(focusChangeListener);
- 处理返回键关闭软键盘的情况:
重写Activity的onBackPressed方法,确保软键盘关闭后显示目标View:
@Override public void onBackPressed() { if (imm.isActive()) { imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); // 延迟执行确保软键盘完全关闭 targetView.postDelayed(() -> targetView.setVisibility(View.VISIBLE), 200); } else { super.onBackPressed(); } }
方案二:使用WindowInsetsCompat监听(推荐,适配Android 10+)
从Android 10开始,WindowInsets提供了直接监听软键盘显隐的API,不受adjustNothing设置影响,低版本可通过AppCompat兼容库实现:
- 添加依赖(若项目未引入):
implementation 'androidx.core:core-ktx:1.12.0'
- 在Activity的
onCreate中设置WindowInsets监听:
View rootView = getWindow().getDecorView().getRootView(); View targetView = findViewById(R.id.target_view); ViewCompat.setOnApplyWindowInsetsListener(rootView, (v, insets) -> { WindowInsetsCompat windowInsets = WindowInsetsCompat.toWindowInsetsCompat(insets); // 判断软键盘是否可见 boolean isKeyboardVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime()); targetView.setVisibility(isKeyboardVisible ? View.GONE : View.VISIBLE); // 返回insets,让其他View继续处理布局 return ViewCompat.onApplyWindowInsets(v, insets); }); // 请求重新计算WindowInsets rootView.requestApplyInsets();
注意事项
- 方案二中,切换EditText时软键盘保持可见,目标View会自动维持Gone状态,无需额外处理。
- 方案一中的延迟时间可根据设备实际响应速度调整,确保软键盘完全关闭后再显示View。
内容的提问来源于stack exchange,提问作者Ummer Siddique
相关产品推荐
相关产品推荐

