情景
特殊情况需要获得软键盘的弹出状态,进行特定的UI展示与隐藏。
实现
重写外层布局
通过log打印,会发现每一次的弹出与缩回,外层布局会有多次的测量、布局的操作。这里在onMeasure()方法获取每次的测量状态。
/**
* 监听界面因为软键盘弹出/收起事件引起界面改变,增加界面改变监听事件。
* 换言之:监听软键盘的弹出/收起事件
*
* @author fengzhen
* @version v1.0, 2017/9/28
*/
public class WindowChangeLinearLayout extends RelativeLayout {
private OnWindowChangeListener listener;
public void setListener(OnWindowChangeListener listener) {
this.listener = listener;
}
public WindowChangeLinearLayout(Context context) {
super(context);
}
public WindowChangeLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public WindowChangeLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
if (listener != null) {
listener.onSizeChanged(width, height, getWidth(), getHeight());
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* 窗体大小改变事件
*
* @author fengzhen
* @version v6.1.0, 2017/9/28 10:13
*/
public interface OnWindowChangeListener {
void onSizeChanged(int width, int height, int i, int height1);
}
}
实现监听
// 7.0之后拍摄照片后返回会重复测量高度,且存在几十像素的变化,此时不应该进行操作
int keyHeight = getWindowManager().getDefaultDisplay().getHeight() / 4;
mMyLayout.setListener((width, h, i, oldh) -> {
if (h > oldh && (h - oldh) > keyHeight) {
// 隐藏键盘 todo
} else if (h < oldh (oldh - h) > keyHeight) {
// 弹出键盘 todo
}
});