软键盘弹出顶起布局

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiey94/article/details/79991361

我这个情况比较单一,可能跟某些需求不一样,仅供参考;
这里写图片描述

这里写图片描述

这里写图片描述

我的需求是这样的,底部放一个按钮,点击的时候,从底部弹出一个布局,点击布局中的输入框的时候软键盘弹起,但是软键盘不能遮挡这个布局,需要将这个布局顶上去,就是第三张图的效果;

但是经过我测试后发现结果是只能将第一个EditText顶起来,第一个EditText以下的部分还是被遮挡了。

类似需求着急使用的可以直接看使用;

思路:从底部弹出一个布局,想到的是用自定义布局,popWindow,还有BottomSheet系列,我选择了BottomSheetDialog;
但是软键盘的遮挡无情的阻断了我的路,我开始也是去改变android:windowSoftMode这个属性,但是不管怎么用都没用,在单个Activity中使用,在java代码上使用,始终没效果,然后突然醒悟,我要作用的是dialog,我在Activity中用有什么用,然后去在dialog的布局中用这个属性,怎么用呢,在style文件中定义一个style,然后在item中使用这个属性,最后在布局中使用这个style,但是,

没用,

依旧如此

然后去网上找大神们的解决方案,记得之前好像无意中扫过布局被软键盘顶起的一篇文章,当时还大概的看了一眼,好像是监听软键盘的弹起,然后测试软件盘的高度来动态改变被顶起布局距离底部的高度,听起来不错,然后看到别人的一个方案,自定义一个ViewGroup,在onMeasure中去这样动态的测量就OK,但是关于弹起收缩软键盘这个问题又是一个死胡同,我以为会有一个回调方法什么,结果也需要曲线救国,各种解决方案一大堆,但都多多少少有点缺陷,本来碎片化就严重,这样就更可怕了。

也尝试过使用ScrollView这样的解决方案,但是对我无效,也可能是我使用的不对;

看到另一个解决方案,是将输入框上面的图片logo进行缩放已达到顶起的效果,但是这个对于我不适用,我没有那么大的logo要放置,此处也不需要,我倒是挺想放我的自拍,但是公司研究后一致表示不同意,这个方案也就搁浅了。

再想别的招把,要不舍弃一部分美观,我将这个布局按钮的marginBottom设置大一点,看看效果,效果是有的,但是由于不知道软键盘的高度,所以我干脆一点,设置顶部Layout的高度为铺满,这样键盘始终在下面,就不存在遮挡的问题了,但是这样也不行,因为BottomSsheetDialog好像只加载出顶部Layout的height为wrap_content的样子,呈现不了match_parent的样子,始终就是不能铺满;这个方案也不行,那我在Button下面加一个weight=1的View或者Space,尝试后也不行,难道要将marginBottom写的贼大?这个就更不靠谱了。

搞事情啊!!!

再想想,还有什么办法,当我在这个布局底部放置一个图片的时候,无意的先滑动了一下布局,再弹出软键盘,这样的操作后,竟然达到了我想要的效果,但是我难道 还要提示用户你再这个地方要划一下吗?显然不可能,我就想着能不能在弹出来的时候让他自己先滑动一下,记得以前好像用到过BottomSheet系列,好像有个辅助的模式什么的东西,找了找,找到了BottomSheetBehavior,哈哈,就是你,然后找到了setPeekHeight这个方法,看别人用的是显示屏幕高度的0.4,我也试了一下,果然只弹出0.4的高度,而且软键盘弹出的时候他也被顶上去了,但是我要弹出我全部的布局,那就算一下布局高度比,然后在我还没算的时候,想起了之前BottomSheetDialog不能铺满的特征,我如果直接写铺满高度的话,那就应该刚好只显示我的布局高度,然后果然如此。

使用简单:
定义一个xml布局,然后引用

bottomSheet = new BottomSheetDialog(this);
bottomSheet.setContentView(R.layout.dialog_credit_grant);

用他的show()方法,就OK了;

WindowManager wm = this.getWindowManager();
int height = wm.getDefaultDisplay().getHeight();
View view = bottomSheet.getDelegate().findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(view);
bottomSheetBehavior.setPeekHeight((int) (1.0 * height));

指定它的高度为全屏,这样就可以了。


当然这还是我暂时能看到的,不知道后续会暴露出什么问题,等后期如果使用中出了问题,我再反馈一下。

参考:
【Android】BottomSheetDialog详解
Android使用BottomSheetBehavior 和 BottomSheetDialog实现底部弹窗
Android软键盘(六)如何监听到软件盘显示与隐藏的事件
Android layout实现输入法弹出后,布局整体上移
bottomsheetdialog 中有个EditText,弹出软键盘会把Dialog往上面挤
转载一篇干货,Android软键盘弹出时把布局顶上去的解决方法
Google MaterialDesign_BottomSheetDialog简单用法


猜你喜欢

转载自blog.csdn.net/xiey94/article/details/79991361