Android软键盘遮挡布局问题;

时间:2022-10-27 16:45:01

布局被软键盘遮挡虽然不是什么大问题,但还是比较影响用户体验的;最让人恼火的是当前输入框被软键盘被遮挡,来看一下解决方法;

1、当前输入框被软键盘遮挡,仅把输入框显示出来,不改变整体布局;

设置Manifest:

android:windowSoftInputMode="adjustPan"

代码设置:要在setContentView之前

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

2、如果需求这样告诉你,输入框下面的登录按钮也要显示出来;那么用第一种方式就不行了;

这个是测试给提出的BUG:说在左边的这个手机 登录按钮、忘记密码、账号注册,这几个地方被软键盘遮挡了;右边的手机显示正常;

我回复他:你手机屏幕小,我能有什么办法;

然后需求告诉我:兼容性问题,开发请修改;

Android软键盘遮挡布局问题;

无奈```开始修改吧!

我的思路是这样的:1、这个登录界面的最外层布局使用ScrollView,因为它可以上下滚动;

2、如果输入框EditText被触摸或焦点发生变化,这时软键盘会弹出,键盘弹出后改变ScrollView的位置,让其显示最下面;

代码如下:

       etMobile.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
initlist();
}
});
etMobile.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
initlist();
return false;
}
});
etCodePassword.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
initlist();
}
});
etCodePassword.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
initlist();
return false;
}
});
private void initlist() {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
sc.postDelayed(new Runnable() {
@Override
public void run() {
sc.smoothScrollTo(0,sc.getHeight());
}
}, 300);
}

效果图如下:

Android软键盘遮挡布局问题;

但是,如果这个界面是全屏显示,沉浸式的话,ScrollView改变位置就不能使用了;

3、改变布局,让登录按钮显示出来;

大致思路:监听软键盘是否显示,如果软键盘显示,就把输入框以上的布局隐藏GONE了;

代码实现:(监听界面发生改变的使用最外层的布局)

//监听界面是否发生改变(如果发生改变我们我认为软键盘有变化)
sc.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
sc.postDelayed(new Runnable() {
@Override
public void run() {
//判断现在软键盘的开关状态
if(SoftKeyboardUtils.isSoftShowing(LoginActivity.this)){
rl.setVisibility(View.GONE);
StatusBarCompat.setLightStatusBarColor(LoginActivity.this); //关闭沉浸式
}else{
rl.setVisibility(View.VISIBLE);
StatusBarCompat.translucentStatusBar(LoginActivity.this, true); //开启沉浸式
}
}
},100L);
}
});

SoftKeyboardUtils是我抽取监听软键盘的工具类:https://blog.csdn.net/qq_35605213/article/details/80763863

效果如下:(可以做一个隐藏的动画,效果会好一点)

Android软键盘遮挡布局问题;              Android软键盘遮挡布局问题;