情景
特殊情況需要獲得軟鍵盤的彈出狀態,進行特定的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
}
});