android記一次解決鍵盤遮擋問題

程式猿tx發表於2018-12-09

文章連結:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw

日常android開發過程中,會遇到編輯框輸入內容彈出軟鍵盤,往往會出現鍵盤遮擋內容,或者出現頁面整體上移的,或多或少在體驗上都不是很優雅,今天提供個方法是自行控制頁面上移距離,竟可能讓頁面呈現給使用者友好點。

一般我們會在AndroidManifest.xml 裡配置windowSoftInputMode來控制鍵盤與頁面的互動。

舉個例子,一個簡單的登入頁面。

adjustResize

activity 加<activity android:windowSoftInputMode="adjustResize">
adjustResize:Activity總是調整螢幕的大小以便留出軟鍵盤的空間,可以看到頁面整體上移,最下面的一行字也可以看到。

adjustPan

activity 加<activity android:windowSoftInputMode="adjustPan">
adjustPan:當前視窗的內容將自動移動以便當前焦點不被鍵盤覆蓋,使用者能總是看到輸入內容的部分。
可以發現頁面會自動移動,以便獲取焦點的editText 不被鍵盤遮住,但是確定按鈕被遮住了,使用者需要自行隱藏鍵盤 再確定。

而我想要的效果是使用者輸入過程中 確定 按鈕一直可見,且要底部的內容被遮擋,這就需要我們自己控制頁面上移距離。
監聽鍵盤彈出/隱藏的過程,獲取鍵盤高度,計算需要上移的高度,以便按鈕可見。

//監聽鍵盤彈出/隱藏
container.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Rect rect = new Rect();
        //getWindowVisibleDisplayFrame 獲取當前視窗可視區域大小
        getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
        int screenHeight = getWindow().getDecorView().getHeight();
        //鍵盤彈出時,可視區域大小改變,螢幕高度 - 視窗可視區域高度 = 鍵盤彈出高度
        int softHeight = screenHeight - rect.bottom;
        /**
         * 上移的距離 = 鍵盤的高度 - 按鈕距離螢幕底部的高度(如果手機高度很大,上移的距離會是負數,介面將不會上移)
         * 按鈕距離螢幕底部的高度是用螢幕高度 - 按鈕底部距離父佈局頂部的高度
         * 注意這裡 btn.getBottom() 是按鈕底部距離父佈局頂部的高度,這裡也就是距離最外層佈局頂部高度
         */
        int scrollDistance = softHeight - (screenHeight - btn.getBottom());
        if (scrollDistance > 0) {
            //具體移動距離可自行調整
            container.scrollTo(0, scrollDistance + 60);
        } else {
            //鍵盤隱藏,頁面復位
            container.scrollTo(0, 0);
        }
    }
});

效果如下:

這樣使用者輸入完成之後就可以直接點選確定按鈕,體驗上有所改善。

當然,具體使用哪種方法得看頁面需求。

github地址:https://github.com/taixiang/Input

歡迎關注我的個人部落格:https://www.manjiexiang.cn/

更多精彩歡迎關注微訊號:春風十里不如認識你
一起學習,一起進步,歡迎上車,有問題隨時聯絡,一起解決!!!


相關文章