You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Activity设为adjustNothing时的软键盘可见性监听问题

解决adjustNothing下监听软键盘显隐控制View可见性的问题

当设置android:windowSoftInputMode="adjustNothing"时,系统不会调整窗口布局,这会导致依赖布局变化的软键盘监听方案(包括你使用的KeyboardVisibilityEvent库)失效。以下是两种可行的解决方案:

方案一:结合EditText焦点监听+InputMethodManager状态判断

这种方案无需额外依赖库,通过监听EditText焦点变化,配合输入法管理器判断软键盘状态来控制目标View的显示:

  1. 给两个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);
  1. 处理返回键关闭软键盘的情况:
    重写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兼容库实现:

  1. 添加依赖(若项目未引入):
implementation 'androidx.core:core-ktx:1.12.0'
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:55:59