android只設置部分控件隨着軟鍵盤的出現而騰出空間

轉載請標明出處:http://www.javashuo.com/article/p-chfikdtq-hw.htmlhtml

 

在項目過程當中,出現了一個需求,軟鍵盤要頂起部分控件,而另外一部分控件不動。android

關於這種需求,咱們須要明確佈局方式:api

一、線性佈局是行不通的,即便被頂上去也是所有被頂上去,由於線性佈局中裏面的控件都是線性排列的,那麼咱們就用相對佈局這種方式。ide

二、相對佈局這種方式中,須要被頂上去的那一部分須要用一個父佈局包裹起來,而且與不須要頂起來的那一部分不能有依賴關係,好比layout_above這類的,不然一個位置改變,另外一個也會跟着改變。佈局

項目中須要被頂起來的那一部分使用了:android:layout_alignParentBottom="true",置於底部。ui

 

其他的:spa

佈局這樣子以後,還要在manifests文件裏面配置android:windowSoftInputMode="adjustResize".net

 

然而會發現仍是沒有被頂起來,其實還差一個,在須要被頂起來的那一個父佈局裏面加上android:fitsSystemWindows="true"code

 

這樣又出現了另外一個問題:當咱們使用沉浸式狀態欄的時候,設置android:fitsSystemWindows="true"會致使該父佈局上面多出一塊空白,聽說這塊空白的高度就是狀態欄的高度。htm

 

最後發現能夠用下面的方法解決:

須要被頂起來的一個父佈局採用自定義的佈局,而後重寫相應的方法:

@Override
    protected boolean fitSystemWindows(Rect insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            insets.left = 0;
            insets.top = 0;
            insets.right = 0;
        }
        return super.fitSystemWindows(insets);
    }
 
    @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH)
    @Override
    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0, insets.getSystemWindowInsetBottom()));
        } else {
            return insets;
        }
    }

這樣便解決了。

參考:https://blog.csdn.net/dbmonkey/article/details/84966318

相關文章
相關標籤/搜索