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

轉載請標明出處:http://www.nxrnyq.tw/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

 

posted @ 2019-12-09 21:53  妖久  閱讀(...)  評論(...編輯  收藏
四川金7乐历史开奖号码查询