问题
下面是我的一段加载视图的逻辑,这个页面中的输入框获取焦点并弹出虚拟键盘之后,再关掉虚拟键盘,动态添加的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,它可能会更好地处理键盘弹出和收起的情况。