轉載請標明出處: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; } }
這樣便解決了。