前几天在定制短信应用,其中我们经过讨论把短信编辑界面的添加各类附件入口,由原来弹框的形式改为类似微信底部添加附件的方式。涉及到软键盘的呈现以及附件界面的呈现,以及它们之间的切换。如下这几种情况:
这个时候如果我点击输入框,希望软键盘能够把聊天界面往上顶起。
这个时候如果我点击输入框,希望软键盘能够覆盖在附件界面之上
这种时候如果我点击右方的加号按钮,我希望软键盘隐藏,附件直接出现。
如果我按返回按键或者输入法下箭头,整个聊天界面下移到正常。
首先我们先了解软键盘呈现的方式,方式可以在AndroidManifest.xml里面进行配置,
adjustNothing 布局不变,软键盘覆盖当前布局
adjustResize 布局会被软键盘顶起,布局高度缩小
adjustPan 布局高度不变,上移动,腾出足够空间给软键盘,ActionBar上移
adjustUnspecified 系统根据条件选择adjustResize 和 adjustPan
这几种方式也可以在代码里通过调用当前窗口的setSoftInputMode方法进行设置。
了解了以上,我们知道如果想要满足需求,我们有以下几方面需要做到:
1、获取软键盘的高度并且设置附件的高度与它一致
2、在不同的条件下,让软键盘以不同的方式呈现
获取软键盘的高度
有以下两种方式:
1、
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//获取屏幕的高度
int screenHeight = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();
Rect rect = new Rect();
getWindowVisibleDisplayFrame(rect); // 获取可见区域
if (screenHeight - rect.bottom > 0.4 * screenHeight) {
int softInputHeight = screenHeight - rect.bottom;
// 通知对附件的高度进行计算等
}
}
});
2、
在最外层布局的onSizeChanged回调方法中,告知监听者高度已改变,由监听者去计算软键盘的高度,分两部分,
a、自定义HeightChangedLinearLayout布局,重写onSizeChanged方法
public class HeightChangedLinearLayout extends LinearLayout {
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (DEBUG)Log.d(TAG, "onSizeChanged(): oldw = " + oldw + ", oldh = " + oldh
+ ",w = " + w + ", h = " + h);
final int fw = w;
final int fh = h;
final int fow = oldw;
final