欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android只设置部分控件随着软键盘的出现而腾出空间

程序员文章站 2022-06-23 22:53:31
转载请标明出处: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;
        }
    }

这样便解决了。

参考: