1.TabLayout相关
1.能否实现indicator渐变色
不能,除非自定义view,也就是是针对每个TAB设置customView
2.自定义customView自带间距如何消除
设置自定义View时,手动消除间距
tab.view.setPadding(0,0,0,0)
2.聊天布局
聊天布局很场景,上面是聊天的列表内容,下面是输入框
1.如何让聊天输入框聚焦+软键盘顶起的时候,列表布局也跟着顶上去
同理,软键盘收起的时候,列表要同步往下拉
1.manifest文件中设置adjustResize,支持调整布局
2.xml布局中:NestedScrollView包裹LinearLayout(含有占满的RecycleView都底部的EditText)
3.页面布局完成时,通过NestedScrollView高度减去EditText的高度,剩下的高度设置给RecycleView
通过该几步即可实现效果
但是还有些问题:
1.若底部输入框是可变高度,则会导致ScrollView的高度发生变化
则会出现滑动的时候输入框会超出部分。
处理:
监听输入框区域高度的变化,重新计算列表布局的高度即可。
2.输入框与ScrollView滑动冲突的问题
处理:
editText设置touchListener,默认返回false,其中处理scrollView.requestDisallowInterceptTouchEvent(true)
2.如何监听软键盘弹出和收起
网上案例太多了
3.ViewPager2
1.如何实现页面切换动画为覆盖的效果
设置切页动画无效(仅第一次有效)
方法:
在切页前设置viewPager2.setCurrentItem(tab.position,false)
设置false很重要,即去掉平滑滑动,也就呈现了替换页面的动画效果
2.NestedScrollView嵌套ViewPager2
使用scrollView.fullScroll(View.FOCUS_DOWN)
可以让软键盘顶起的时候,布局也往上顶。
但是,底部的输入框焦点会丢失。如何处理?采用如下方法
val scrollY = scrollView.getChildAt(0).height - scrollView.height
scrollView.scrollTo(0,scrollY)
因为scrollTo未进行焦点的重新获取,所以不会对EditText焦点造成影响。
4.ConstraintLayout
1.如何实现两个View等宽
说到这里,既然在ConstraintLayout下,那么里面约束即可做到。
一个View的约束start与end对齐另外一个view即可
同理,等高也是一样的方法。
5.获取屏幕高度
原有的getDefaultDisplay方法已经过时,且在设备上获取的高度不包括状态栏和底部导航栏。
更改的方法参考:
https://blog.csdn.net/banzhuantuqiang/article/details/135245512
6.RecycleView
1.嵌套竖向RecycleView滑动处理
第二层RecycleView在只是显示子item个数的情况(不分页加载),一般会出现滑动无法带动最外层滑动的情况
如何上下滑动最里层的RecycleView时带动最外层滑动?
将被包裹的RecycleView的LinearLayoutManager重写,覆写canScrollVertically
并返回false即可。
7.软键盘
1.监听软键盘
实现方式是:
通过rootView.viewTreeObserver.addOnGlobalLayoutListener来进行布局监听,获取超过屏幕0.15即认为是发生了软键盘弹窗,否则是隐藏了软键盘。
这种方式是可以监听到软键盘的显示和关闭,但需要注意的时候,此处收到事件时,其实软键盘状态还未发生变更。(因为事件分发从顶层向底层传递)若想获取被顶起的布局位置等信息,需要做个延时获取。