軟鍵盤彈出/縮回事件監聽

情景

特殊情況需要獲得軟鍵盤的彈出狀態,進行特定的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
    }
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章