问题

下面是我的一段加载视图的逻辑,这个页面中的输入框获取焦点并弹出虚拟键盘之后,再关掉虚拟键盘,动态添加的view高度貌似会变,导致页面被虚拟键盘遮挡(或者说被折叠,被键盘覆盖)的一部分会变成背景色。

val inflater: LayoutInflater =
getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
view = inflater.inflate(R.layout.paipai_apply_layout, null, false)
val layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)

view.layoutParams = layoutParams
binding.showView.removeAllViews()
binding.showView.addView(view)

解决方案:

1. 设置windowSoftInputMode

android:windowSoftInputMode="adjustPan"

2. 手动触发父布局的重新布局

若是需要设置adjustResize,可以使用下面的方法

// 假设你的输入框是 editText
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // 当输入框失去焦点时(即键盘收起时)
            // 强制父容器重新测量和布局
            binding.showView.requestLayout();
        }
    }
});

3. 使用CoordinatorLayout

如果你使用的是 CoordinatorLayout,它本身就有一套复杂的行为来处理这种布局变化。如果你将输入框放在 CoordinatorLayout 中,并正确设置了 Behavior,它可能会更好地处理键盘弹出和收起的情况。