轉載請標明出處:https://www.cnblogs.com/tangZH/p/12013685.html 在項目過程中,出現了一個需求,軟鍵盤要頂起部分控制項,而另一部分控制項不動。 關於這種需求,我們需要明確佈局方式: 1、線性佈局是行不通的,即使被頂上去也是全部被頂上去,因為線性佈局中裡面的控制項 ...
轉載請標明出處:https://www.cnblogs.com/tangZH/p/12013685.html
在項目過程中,出現了一個需求,軟鍵盤要頂起部分控制項,而另一部分控制項不動。
關於這種需求,我們需要明確佈局方式:
1、線性佈局是行不通的,即使被頂上去也是全部被頂上去,因為線性佈局中裡面的控制項都是線性排列的,那麼我們就用相對佈局這種方式。
2、相對佈局這種方式中,需要被頂上去的那一部分需要用一個父佈局包裹起來,並且與不需要頂起來的那一部分不能有依賴關係,比如layout_above這類的,否則一個位置改變,另一個也會跟著改變。
項目中需要被頂起來的那一部分使用了:android:layout_alignParentBottom="true",置於底部。
其餘的:
佈局這樣子之後,還要在manifests文件裡面配置android:windowSoftInputMode="adjustResize"
然而會發現還是沒有被頂起來,其實還差一個,在需要被頂起來的那一個父佈局裡面加上android:fitsSystemWindows="true"
這樣又出現了另一個問題:當我們使用沉浸式狀態欄的時候,設置android:fitsSystemWindows="true"會導致該父佈局上面多出一塊空白,據說這塊空白的高度就是狀態欄的高度。
最後發現可以用下麵的方法解決:
需要被頂起來的一個父佈局採用自定義的佈局,然後重寫相應的方法:
@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