BottomSheetDialog是一种可以从屏幕底端出现,上下滑动即可关闭或展开的对话框布局,因为其扩展性、易用性强,占用布局面积小等优势深受开发者的喜爱,具体可以参见我之前的文章:《BottomSheetDialog沉浸式的一些坑》( //www.greatytc.com/p/08755838c00f )有相关介绍。
正常情况下在BottomSheetDialog中嵌套滑动布局的不会出现任何问题的,但当你嵌套Listview时就可能出现如下的滑动冲突问题了:
问题复现
1.前提:当BottomSheetDialog完全展开(全屏)的情况下;
2.列表内容高度撑起整体布局高度,并大于屏幕高度的情况下;
3.向上滑动列表到列表底部;
4.向下滑动,发现列表没动,BottomSheetDialog却被滑动了,导致此时容易误操作关闭BottomSheetDialog。
解决方案:
1.在列表滑动事件截获Touch触摸事件;
2.判断列表处于顶端时才取消截获Touch触摸事件
完美解决!
代码中isListAtTopFlag 为列表是否处于顶端的Flag,名为listTask的列表处于顶端时释放Touch触摸事件的方法,让BottomSheetDialog获取触摸事件即可。
相关代码如下:
listTask.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!listTask.canScrollVertically(-1)) { //canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
listTask.requestDisallowInterceptTouchEvent(false);
}else{
listTask.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
以上。
如果本文对您有所帮助麻烦点个赞,如有疑问欢迎在评论区留言交流。