开局就是二张图。先看效果是不是自己想要的,然后再慢慢往下看。第一张图是默认高度,第二张图是高度增加之后的变化。可以看到,切换还是蛮顺畅的,没有出现跳闪的情况。
这两天在弄一个留言板功能,可进行文字、语音、图片还有其他功能的留言。这时就需要一个面板来存放这些附加功能。一般都是输入框旁边有个加号,来进行面板的弹出。但是我当我底部面板出现时,会出现跳闪问题,就是面板和输入框会被软键盘顶到上面去,然后等软键盘收起来,面板才降下来,这种效果体验起来不是很好,就先自己想了想,但也没想到好的解决办法,又看了看微信、QQ、支付宝的聊天界面,体验效果很好,并且当软键盘的高度变化时,面板的高度也会随之变化。体验效果很好。
算了,还是百度,搜了搜知道了大致的解决方案。就是当面板和输入框切换时去改变软键盘的显示模式。一般我们改变软键盘的显示模式都是在清单文件AndroidManifest.xml中对Activity的windowSoftInputMode标签进行修改。但这次我们需要在代码总动态的去改变。主要是针对这两种模式进行改变。如下
当属性为adjustResize的时候,软键盘弹出时会挤压Activity窗口大小,这样可以保证输入法不会覆盖到输入框;
当属性为adjustNothing的时候,软键盘弹出时会覆盖到当前窗口上,窗口大小不变,这种情况输入法有可能会覆盖输入框。
知道解决的关键点之后,还需知道软键盘的高度,以及软键盘的隐藏和显示状态。这样就可以对不同的情况进行相应的改变。
先上代码获取软键盘的高度和显示、隐藏状态的代码。
public class KeyboardLayout extends FrameLayout {
private KeyboardLayoutListener mListener;
private boolean mIsKeyboardActive = false; // 输入法是否激活
private int mKeyboardHeight = 0; // 输入法高度
public KeyboardLayout(Context context) {
this(context, null, 0);
}
public KeyboardLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public KeyboardLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 监听布局变化
getViewTreeObserver().addOnGlobalLayoutListener(new KeyboardOnGlobalChangeListener());
}
private class KeyboardOnGlobalChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {
int mScreenHeight = 0;
private int getScreenHeight() {
if (mScreenHeight > 0) {
return mScreenHeight;
}
mScreenHeight = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getHeight();
return mScreenHeight;
}
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
// 获取当前页面窗口的显示范围
((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int screenHeight = getScreenHeight();
int keyboardHeight = screenHeight - rect.bottom; // 输入法