布局被软键盘遮挡虽然不是什么大问题,但还是比较影响用户体验的;最让人恼火的是当前输入框被软键盘被遮挡,来看一下解决方法;
1、当前输入框被软键盘遮挡,仅把输入框显示出来,不改变整体布局;
设置Manifest:
android:windowSoftInputMode="adjustPan"
代码设置:要在setContentView之前
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
2、如果需求这样告诉你,输入框下面的登录按钮也要显示出来;那么用第一种方式就不行了;
这个是测试给提出的BUG:说在左边的这个手机 登录按钮、忘记密码、账号注册,这几个地方被软键盘遮挡了;右边的手机显示正常;
我回复他:你手机屏幕小,我能有什么办法;
然后需求告诉我:兼容性问题,开发请修改;
无奈```开始修改吧!
我的思路是这样的: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);
}
效果图如下:
但是,如果这个界面是全屏显示,沉浸式的话,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
效果如下:(可以做一个隐藏的动画,效果会好一点)