天天看點

android軟鍵盤彈起面試題

軟鍵盤彈起後遮擋布局有什麼解決方案?

1設定windowSoftInputMode 軟鍵盤彈起時布局自動變化或許可以解決

2監聽根布局變化,擷取軟鍵盤高度,然後滾動或移動界面

windowSoftInputMode中adjustResize和adjustPan什麼差別?

adjustResize會改變activity的高度,adjustPan會移動布局

一個登陸界面,輸入框和按鈕,鍵盤彈起時會遮擋按鈕,如何做使按鈕不被遮擋?

如果登陸界面很簡單,隻有輸入框和登陸按鈕此時可以設定windowSoftInputMode為adjustResize,

隻要保證輸入框和按鈕再activity高度變化時還能完全顯示在Activity中此時按鈕就不會被遮擋(類似使用了layout_weight),

如果輸入框上部已經有内容且高度加上輸入框和按鈕高度後大于螢幕高度減去軟鍵盤高度的長度,依然沒法解決。

設定adjustpan隻能保證目前擷取焦點的控件不被遮擋。

還有一種辦法就是監聽根布局變化(OnGlobalLayoutListener),利用scrollTo等移動布局。

全屏模式下軟鍵盤彈起的bug遇到過沒有?

設定了activity全屏顯示,此時設定windowSoftInputMode為adjustResize或者監聽根布局OnGlobalLayoutListener都會失效。

此為android系統bug,網上解決方案是監聽android.R.id.content 根布局的第一個孩子,通過檢測getWindowVisibleDisplayFrame,判斷是否有軟鍵盤彈起,然後調用重新布局requestLayout函數解決。

擷取軟鍵盤高度方法?

我常用方法:
           
//layout change
    private void controlKeyboardLayout(final View root, final View needToScrollView) {
        root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            private Rect r = new Rect();
            @Override
            public void onGlobalLayout() {
//擷取可視區域,彈起鍵盤時可視區域不包括軟鍵盤
                ((Activity) mContext).getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//根布局高度
                int screenHeight = ((Activity) mContext).getWindow().getDecorView().getRootView().getHeight();
//布局高度減去可視區域底部坐标
                int heightDifference = screenHeight - r.bottom;
                //bottomStatusHeight 代表底部導航高度,虛拟按鍵
                if (heightDifference == bottomStatusHeight) {
            //此時沒有軟鍵盤
                    needToScrollView.scrollTo(0, 0);
                } else {
//此時存在軟鍵盤
                  
              
            }
        });
    }
           

繼續閱讀