1、场景描述
在软键盘弹出时,如果EditText位置与底部距离小于软键盘高度时,一般软键盘会把EditText顶上去,那么整个Activity都会被顶上去,包括ActionBar或者ToolBar。
2、需求
其实我们并不希望ActionBar或者ToolBar被顶上去,只希望ActionBar或者ToolBar以下部分滚动即可。
3、踩坑日记
我记得以前在ActionBar或者ToolBar下面的布局外套一个滚动容器就可以了的,想都没想,直接套了个NestedScrollView,结果ToolBar还是被顶上去了,然后各种百度,各种测试,无果。网上有说套一个ScrollView,我当时想都是滚动容器NestedScrollView和ScrollView不都一样嘛,也没去改,下班了还搞了半个小时没搞定。
4、填坑之旅
第二天回到公司,把NestedScrollView换成ScrollView,居然可以了,难怪以前一直没有遇到过这样的问题,因为用的是ScrollView,
总结:
用ScrollView可以防止软键盘把ToolBar顶上去。可是,ScrollView自带滚动条,难看死了,果断加上去掉滚动条的属性,一测试,ToolBar又被顶上去了(ri le gou le)。
android:scrollbars="none"
再次总结:
ScrollView一定要带滚动条,才能防止ToolBar被顶。
辣么,问题来了,如果让NestedScrollView也显示滚动条,是不是也可以防止ToolBar被顶呢,测试结果和理想一样。
再次总结:
ScrollView和NestedScrollView都能防止ToolBar被顶,只要显示滚动条即可。
可是,我就不想要滚动条呀,咋办?陷入沉思,那就把滚动条设为透明的或者把滚动条宽度设为0,这个思路应该ok,怎么设呢...习惯性先去源码看一眼有没有合适的属性,发现有个叫isScrollContainer的属性,注释介绍大概和软键盘有关,那就拿出来测试下吧。
5、惊喜
NestedScrollView中添加isScrollContainer属性,果然可以解决问题。
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="true"
android:overScrollMode="never">
6、总结
防止ActionBar和ToolBar被软键盘定出去的方法:
1、如果使用NestedScrollView,则需添加属性
android:isScrollContainer="true"
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="true"
android:overScrollMode="never">
2、如果使用ScrollView,则需添加属性
android:isScrollContainer="true"
android:scrollbars="none"
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:isScrollContainer="true"
android:overScrollMode="never">
踩坑不可怕,可怕的是同一个坑连踩两次,还不知道怎么解决,这里先做下笔记,免得下次遇上同样的问题,又忘了怎么解决了,每次都跑旧项目里翻代码,挺累的,都不记得上次的坑到底是在哪个项目里
网友评论