现在有一个需求,在一个页面中,顶部有一个悬浮的控件一直显示,中间是可滑动的,即使软键盘弹出;底部也有一个悬浮的控件,软键盘弹出的时候,底部悬浮控件不随着软键盘的弹出而上移显示。显示效果如图:
图一:软键盘隐藏
图二:软键盘显示-第一条获取焦点
图三:软键盘显示-最后一条获取焦点
我们知道页面上软键盘弹出的时候页面的显示效果跟android:windowSoftInputMode属性中的类似"adjust..."值有关,类似adjust...的值有三个,adjustUnspecified、adjustResize、adjustPan,三个属性值都实现不了想要的效果(详见https://blog.csdn.net/qiutiandepaomo/article/details/84028558)。
想到的解决方案是:中间部分设置成可滑动的(例如加一个ScrollView或者RecyclerView等),设置windowSoftInputMode属性为adjustUnspecified或adjustResize,来保证顶部标题行一直展示,通过监听软键盘的弹出与隐藏来控制底部按钮的显示,软键盘弹出的时候,底部按钮隐藏,软键盘隐藏的时候,底部按钮展示。
具体实现步骤是:
1、为当前页面最外层的layout设置一个OnLayoutChangeListener监听器监听当前页面变化的高度,认为Activity变化的高度超过屏幕的1/3,就是软键盘弹起或关闭了。
public class MainActivity extends Activity {
RelativeLayout mRlTest;
RelativeLayout mRlCommit;
//屏幕高度
private int screenHeight = 0;
//软件盘弹起后所占高度阀值
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight / 3;
mRlTest = findViewById(R.id.rl_test);
mRlCommit = findViewById(R.id.rl_commit);
mRlTest.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {//认为软键盘将Activity向上推的高度超过了屏幕高度的1/3,就是软键盘弹起了,这个时候隐藏底部的提交按钮
//延迟100ms设置不可见性是避免view还没计算好自己的宽高,设置可见不可见性失效。
mRlCommit.postDelayed(new Runnable() {
@Override
public void run() {
mRlCommit.setVisibility(View.GONE);
}
}, 100);
} else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//认为软键盘将Activity向下推的高度超过了屏幕高度的1/3,就是软键盘隐藏了,这个时候显示底部的提交按钮
mRlCommit.postDelayed(new Runnable() {
@Override
public void run() {
mRlCommit.setVisibility(View.VISIBLE);
}
}, 100);
}
}
});
}
完整代码:https://github.com/ruxing1102/SoftKeyboardTest/tree/master