Android 监测软键盘关闭的实现

1. 流程图

stateDiagram
    [*] --> 进入页面
    进入页面 --> 打开软键盘
    打开软键盘 --> 关闭软键盘
    关闭软键盘 --> 退出页面
    退出页面 --> [*]

2. 步骤和代码实现

步骤1: 进入页面

首先,我们需要在 onCreate() 方法中设置布局和初始化相关的视图组件。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化视图组件
    EditText editText = findViewById(R.id.editText);

    // 设置监听器
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean hasFocus) {
            if (hasFocus) {
                // 获得焦点,软键盘会自动弹出
                openKeyboard();
            }
        }
    });
}

步骤2: 打开软键盘

openKeyboard() 方法中,我们可以使用 InputMethodManager 类的 showSoftInput() 方法来打开软键盘。

private void openKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}

步骤3: 关闭软键盘

为了监测软键盘的关闭,我们可以使用 ViewTreeObserver 类来监听布局树的变化。

private void setupKeyboardListener() {
    final View rootView = findViewById(R.id.rootView);
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            rootView.getWindowVisibleDisplayFrame(r);
            int screenHeight = rootView.getRootView().getHeight();

            // 计算屏幕高度和可见区域的差值,超过一定阈值则表示软键盘已关闭
            int heightDifference = screenHeight - (r.bottom - r.top);
            if (heightDifference > 200) {
                // 软键盘已关闭
                closeKeyboard();
            }
        }
    });
}

步骤4: 退出页面

最后,我们需要在 onDestroy() 方法中移除监听器。

@Override
protected void onDestroy() {
    super.onDestroy();
    removeKeyboardListener();
}

private void removeKeyboardListener() {
    View rootView = findViewById(R.id.rootView);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        rootView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
    } else {
        rootView.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
    }
}

3. 代码注释

步骤1: 进入页面

// 初始化视图组件
EditText editText = findViewById(R.id.editText);

// 设置监听器
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean hasFocus) {
        if (hasFocus) {
            // 获得焦点,软键盘会自动弹出
            openKeyboard();
        }
    }
});

步骤2: 打开软键盘

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

步骤3: 关闭软键盘

rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        rootView.getWindowVisibleDisplayFrame(r);
        int screenHeight = rootView.getRootView().getHeight();

        // 计算屏幕高度和可见区域的差值,超过一定阈值则表示软键盘已关闭
        int heightDifference = screenHeight - (r.bottom - r.top);
        if (heightDifference > 200) {
            // 软键盘已关闭
            closeKeyboard();
        }
    }
});

步骤4: 退出页面

rootView.getViewTreeObserver().removeOnGlobalLayoutListener(listener);

4. 状态图

stateDiagram
    [*] --> 进入页面
    进入页面 --> 打开软键盘
    打开软键盘 --> 关闭软键盘
    关闭软键盘 --> 退出页面
    退出页面 --> [*